zoukankan      html  css  js  c++  java
  • 【读书笔记】推荐系统算法实践(一)

    这里重点是做了协同过滤算法的阅读,以及对我比较重要的一些知识。

    还有之前的pytorch里的一些函数介绍。。

     


    损失函数

    均方损失

    最小二乘法:线性回归方法。拟合曲线应该使所有点到回归直线的距离和最小。

    一般用欧几里得距离度量。

    $L(Y|f(X)) = sumlimits_{N}(Y-f(X))^{2}$

    log对数损失函数:逻辑回归的损失函数就是对数损失函数。

    假设样本服从伯努利分布,然后求似然函数,再用对数求极值。

    $L(Y|f(X)) = -logP(Y|X)$

    指数损失函数:AdaBoost就是指数损失函数。

    $L(Y|f(X)) = exp[-yf(x)]$

    CODE

    import torch
    from torch.autograd import Variable
    import torch.nn as nn
    import torch.nn.functional as F
    
    sample = Variable(torch.ones(2,2))
    a=torch.Tensor(2,2)
    a[0,0]=0
    a[0,1]=1
    a[1,0]=2
    a[1,1]=3
    target = Variable (a)
    #sample: [[1,1],[1,1]]
    #target: [[0,1],[2,3]]
    
    
    #基本用法
    criterion = LossCriterion() #构造函数有自己的参数
    loss = criterion(x, y)      #调用标准时也有参数
    #计算出来的结果已经对mini-batch取了平均
    
    
    #L1Loss
    #预测值和真实值的绝对误差的平均数
    criterion = nn.L1Loss()
    loss = criterion(sample, target)
    #1
    
    
    #SmoothL1Loss
    #HuberLoss,误差在(-1,1)平方损失,其他L1损失
    criterion = nn.SmoothL1Loss()
    loss = criterion(sample, target)
    #0.625
    
    
    #MSELoss
    #平方损失,预测值和真实值之间的平方和的平均数
    criterion = nn.MSELoss()
    loss = criterion(sample, target)
    #1.5
    
    
    #nn.NLLLoss
    #负对数似然损失函数
    #loss(x,class) = -x[class]
    #loss(x,class) = −weights[class]∗x[class]   weights被指定
    
    m = nn.LogSoftmax()
    loss = nn.NLLLoss()
    # input is of size nBatch x nClasses = 3 x 5
    input = torch.autograd.Variable(torch.randn(3, 5), requires_grad=True)
    # each element in target has to have 0 <= value < nclasses
    target = torch.autograd.Variable(torch.LongTensor([1, 0, 4]))
    output = loss(m(input), target)
    output.backward()

    优化方法

    SGD:随机梯度下降。

    每次迭代计算小批量的梯度,使用于数据量比较大的数据集

    Momentum:使用动量的SGD。

    通过积累动量来作为梯度使用。

    AdaGrad:对学习率进行约束。

    适合处理稀疏梯度,对全局学习率参数比较敏感。

    Adam:通过梯度对一阶矩和二阶据估计动态调整每个参数学习率。

    经过偏置校正后,每一次迭代学习率有确定范围,使参数值比较平稳。

    内存要求小,适用于大数据集和高维空间,也适用于大多数非凸优化。

    CODE

    import torch.optim
    
    #使用
    optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)
    optimizer = optim.Adam([var1, var2], lr = 0.0001)
    
    #基类
    torch.optim.Optimizer(params, defaults)
    #params: Variable或者dict的iterable,指定什么参数应当被优化
    #defaults: 包含了优化选项默认值的字典
    
    #方法:
    load_state_dict(state_dict) #加载optimizer状态
    state_dict()                #state:保存优化状态的dict,param_groups:包含全部参数组
    zero_grad()                 #清空被优化的Variable的梯度
    optimizer.step()            #单次优化
    optimizer.step(closure)     #重复多次计算函数,传入闭包,闭包需要清空。
    for input,target in dataset:
        def closure():
            optimizer.zero_grad()
            output = model(input)
            loss = loss_fn(output,target)
            loss.backward()
            return loss
        optimizer.step(closure)
    
    
    
    #SGD
    torch.optim.SGD(params,lr=0.01,momentum=0,dampening=0,weight_decay=0,nesterov=False)
    #params: 待优化参数
    #lr(float): 学习率
    #momentum (float, 可选): 动量因子(默认为0)
    #dampening (float, 可选): 动量的抑制因子(默认为0)
    #weight_decay (float, 可选): 权重衰减(L2惩罚)(默认为0)
    #nesterov (bool, 可选): 使用Nesterov动量(默认为False)
    
    #Adagrad
    torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0)
    #lr_decay (float, 可选): 学习率衰减(默认为0)
    
    #Adam
    torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)
    #betas (Tuple[float, float], 可选): 用于计算梯度以及梯度平方的运行平均值的系数(默认:0.9,0.999)
    #eps (float, 可选): 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8)
  • 相关阅读:
    小进步一点
    首个vue.js项目收尾中……
    elememtui(有关权限的那些事)
    vue.js2.0+elementui ——> 后台管理系统
    console.log篇
    select下拉框不能赋值
    vue中的小踩坑(01)
    vue2.0+element-ui(01简单点的单页面)
    lodash(二)对象+循环遍历+排序
    lodash(一)数组
  • 原文地址:https://www.cnblogs.com/Asumi/p/12470611.html
Copyright © 2011-2022 走看看