课件源于2023 http://web.stanford.edu/class/cs224w/
视频源于深度学习基础(点击跳转)
机器学习是一个优化问题。
监督学习(给x预测标签y,训练集中y没有缺失)是一个优化问题。
输入的x可以是上述数据结构。其中,可以是完整的图。
是参数。主要使用L2损失。
一个常见的分类损失:交叉熵。
此处分类变量y用独热编码表示。并使用softmax进行归一化。
那么怎么去优化这个目标函数?
我们可以通过损失函数评估参数。可以通过梯度向量发现哪个方向的损失函数增加最快。于是就是这个的反方向。
梯度下降算法如下:
迭代算法:在梯度(相反)方向反复更新权值,直至收敛。注意右上角的公式:
表示学习率可以理解为步长。
最理想的状态是梯度为0,达到了函数平坦的地方。
在实践中,如果它不再提高验证集(我们从训练中保留的数据集的一部分)的性能,我们就停止训练。
但有时候数据集太大,不太可能遍历数据集中所有的点,因此采用随机梯度下降(SGD)。
在每一步中,选择一个包含数据集子集的不同minibatch数据库,将其用作输入。
根据上述我们引入了批处理的概念,是我们评估梯度的数据子集。我们不是在整个训练数据集上对其进行评估,而是在训练数据集上的一个小子集上对其进行评估。可能是数百个也可能是数千个示例。Batch size(批量大小)是小批量中数据点的数量。通常我们喜欢使批次更大,但更大的批次会使优化变慢。我们在给定的小批量上评估梯度。An epoch 是对数据集的完整传递。所以迭代的次数是等于数据集大小和Batch size的比例。
如果创建的批次随机,那么SGD是完整梯度的无偏估计。当然收敛速度是没有保证的。这意味着他需要调整学习率。而这个SGD想法是一种常见的核心想法。SGD是全梯度的无偏估计,但不能保证收敛速度,在实践中经常需要调整学习率,然后还有常见的优化器进行优化比如: Adam, Adagrad, Adadelta, RMSprop…本质上,所有人都使用这个核心思想,即选择数据集的子集,评估其上的梯度。
接下来讲讲实际步骤:
对于深度学习,f可能非常复杂,因此不需要将f具体写出来。
如果𝑓返回一个标量,那么𝑊是一个可学习的向量。
如果𝑓返回一个向量,那么𝑊就是权重矩阵,也是𝑓的雅可比矩阵。
有一些介绍:https://blog.csdn.net/gwplovekimi/article/details/104977255
通过链式规则进行派生如下:
反向传播:利用链式法则传播中间阶跃的梯度,最终得到函数的梯度。Θ
比如例子上两层线性网络如下:
隐层:输入的中间表示𝒙。
表示隐含层。
如果我们做二元分类权重矩阵会变成向量。
w.r.t:with respect to的缩写,意思是关于、谈到、涉及等。
我们可以引入非线性函数,ReLU或者Sigmoid。
上述通过乘以Sigmoid就是非线性函数。
总结如下:
下集预告: