有监督机器学习笔记(Super Machine Learning Revision Notes)

本文深入探讨了机器学习中的核心概念,包括激活函数的选择、梯度下降算法的运作原理、计算图的应用、L2正则化的梯度计算、梯度消失与爆炸的问题,以及mini-batch和随机梯度下降等优化技巧。适合初学者和希望巩固基础知识的学习者。


前注:本文是笔记Super Machine Learning Revision Notes(https://createmomo.github.io/2018/01/23/Super-Machine-Learning-Revision-Notes/#tableofcontents)的个人汉化版,主要是为了复习机器学习中的基础概念,以及练练英语:)

本文总结

  • 本文主要涉及机器学习的基础概念(如梯度下降、反向传播)
  • 本文会涉及不同的算法和不同的模型
  • 训练例子来自于原文作者的实践和网络资源(如deep learning AI)

If you a student who is studying machine learning, hope this article could help you to shorten your revision time and bring you useful inspiration. If you are not a student, hope this article would be helpful when you cannot recall some models or algorithms.

目录

激活函数


函数名称函数表达式导数
sigmod g ( z ) = 1 1 + e − z g(z)=\frac{1}{1+e^{-z}} g(z)=1+ez1 g ( z ) ( 1 − g ( z ) ) g(z)(1-g(z)) g(z)(1g(z))
tanh t a n h ( z ) tanh(z) tanh(z) 1 − ( t a n h ( z ) ) 2 1-(tanh(z))^2 1(tanh(z))2.
0, 如果 z < 0 z<0 z<0
relu m a x ( 0 , z ) max(0,z) max(0,z)1, if z > 0 z>0 z>0,
undefined, 如果 z = 0 z=0 z=0,
0.01, 如果 z < 0 z<0 z<0
Leaky relu m a x ( 0.01 z , z ) max(0.01z,z) max(0.01z,z)1, if z > 0 z>0 z>0,
undefined, 如果 z = 0 z=0 z=0

梯度下降

梯度下降是一种迭代方法,其目的是为了寻找目标函数(比如loss function)的局部最小值(最优解)。

Repeat{
    W := W - learning_rate * dJ(W)/dW
}

上述代码展示了对某个参数 W W W的优化方式。
通常,我们使用 α \alpha α 来表示学习率(learning rate)。学习率是神经网络训练中常见的超参, J ( W ) J(W) J(W)一般用以表示模型中的损失函数(loss function), d J ( W ) d W \frac{dJ(W)}{dW} dWdJ(W)是针对 W W W的梯度。如果 W W W是一个参数矩阵(也就是权重), d J ( W ) d W \frac{dJ(W)}{dW} dWdJ(W)就是矩阵中的任意参数的梯度。

那么问题来了:为什么在最小化损失函数时减去梯度而不加上梯度?
回答:
举个例子,我们的损失函数是 J ( W ) = 0.1 ( W − 5 ) 2 J(W)=0.1(W-5)^2 J(W)=0.1(W5)2,它基本长这个样子:梯度下降
W = 10 W=10 W=10, 梯度 d J ( W ) d W = 0.1 ∗ 2 ( 10 − 5 ) = 1 \frac{dJ(W)}{dW}=0.1*2(10-5)=1 dWdJ(W)=0.12(105)=1.显然,当我们想去找 J ( W ) J(W) J(W)的最小值的时候,梯度的反方向( − d J ( W ) d W -\frac{dJ(W)}{dW} dWdJ(W)))是能找到局部最小值的最快的方向(i.e. J ( W = 5 ) = 0 J(W=5)=0 J(W=5)=0)。
但有时梯度下降也会受限于优化方案。
(译者注:梯度下降的相关理论均有严格证明,这里原作者为了形象,用图片给了较为生动的展示,对这方面有兴趣的读者可以参考《最优化导论》了解梯度下降的数学原理及证明)

·计算图

本文的计算图实例来自于Deep Learing AI的第一个公开课程。
假设我们现在有三个可学的参数, a a a, b b b c c c。损失函数 J = 3 ( a + b c ) J=3(a+bc) J=3(a+bc)。那么,我们需要计算三个梯度: d J d a \frac{dJ}{da} dadJ, d J d b \frac{dJ}{db} dbdJ and d J d c \frac{dJ}{dc} dcdJ。我们同时定义 u = b c u=bc u=bc, v = a + u v=a+u v=a+u and J = 3 v J=3v J=3v,那么这个计算过程可以转化为如下的计算图:
forward computation 前向计算

·反向传播

基于上述的计算图,显然各个参数的梯度为 d J d a = d J d v d v d a \frac{dJ}{da}=\frac{dJ}{dv}\frac{dv}{da} dadJ=dvdJdadv, d J d b = d J d v d v d u d u d b \frac{dJ}{db}=\frac{dJ}{dv}\frac{dv}{du}\frac{du}{db} dbdJ=dvdJdudvdbdu, d J d c = d J d v d v d u d u d c \frac{dJ}{dc}=\frac{dJ}{dv}\frac{dv}{du}\frac{du}{dc} dcdJ=dvdJdudvdcdu.
计算每个节点的梯度可以非常简单的展示如下(提示:实际上,如果要实现自己的算法,则可以在正向过程中计算梯度,以节省计算资源和训练时间。 因此,在进行反向传播时,无需再次计算每个节点的梯度。):
对每个节点的梯度计算
通过组合上述节点的梯度,我们可以简单的算出每个参数的梯度:
后向传播bp
d J d a = d J d v d v d a = 3 × 1 = 3 \frac{dJ}{da}=\frac{dJ}{dv}\frac{dv}{da}=3\times1=3 dadJ=dvdJdadv=3×1=3
d J d b = d J d v d v d u d u d b = 3 × 1 × 2 = 6 \frac{dJ}{db}=\frac{dJ}{dv}\frac{dv}{du}\frac{du}{db}=3\times1\times2=6 dbdJ=dvdJdudvdbdu=3×1×2=6
d J d c = d J d v d v d u d u d c = 3 × 1 × 3 = 9 \frac{dJ}{dc}=\frac{dJ}{dv}\frac{dv}{du}\frac{du}{dc}=3\times1\times3=9 dcdJ=dvdJdudvdcdu=3×1×3=9

·L2正则化(L2 Regularizaation)的梯度计算

稍微修改一下之前的梯度下降公式:

Repeat{
    W := W - (lambda/m) * W - learning_rate * dJ(W)/dW
}

·梯度消失/爆炸(Vanishing/Exploding Gradients)

如果我们有一个层数很多的神经网络,并且我们还没有很好的初始化权重,我们也许会遇到梯度消失和梯度爆炸问题(更详细的介绍见Parameter Initialization)。
为了介绍什么是梯度爆炸和梯度消失,我们再次举一个简单的深度学习网络例子(本实例依旧来源于Deep Learing AI)。
这个神经网络拥有 L L L层,为了便于展示,每一层的参数 b [ l ] b^{[l]} b[l]均被设置为0,并且激活函数为 g ( z ) = z g(z)=z g(z)=z,除此之外,我们定义每一层的 W [ l ] W^{[l]} W[l]都是一样的。
基于上述网卡了哟,我们最终可以获得的输出如下所示:
y = W [ l ] W [ l − 1 ] W [ l − 2 ] … W [ 3 ] W [ 2 ] W [ 1 ] X y=W^{[l]}W^{[l-1]}W^{[l-2]}…W^{[3]}W^{[2]}W^{[1]}X y=W[l]W[l1]W[l2]W[3]W[2]W[1]X
如果某个权重为 1.5 > 1 1.5>1 1.5>1,我们最终会在某几个位置上获得一个 1. 5 L 1.5^L 1.5L的爆炸性参数,同样,如果某个权重值比1小,那么这个参数的梯度在某一层就会趋近于0,也就是消失了。
梯度爆炸和梯度消失都会造成训练的极度困难,所以小心初始化神经网络权重是必要的。

·mini-batch Gradient Descent

注:这句话不太好翻译,大致意思就是设置个batch
如果我们有一个巨大的训练集,那么我们训练一个epoch就可能需要很久。如此一来追踪整体的训练进度就很困难。因此我们提出mini-batch gradient descent,损失和梯度都是由当前的一个batch的训练实例计算的。

假设 X X X代表整个训练集,并且被分割为若干个batch, m m m是batch中训练数据的数量。mini-batch的训练方式如下:

For t= (1, ... , #Batches):
 基于第t个batch的数据进行前向计算
 计算基于第t个batch的损失
 基于第t个batch进行反向传播,更新损失函数和参数

在训练过程中,应用mini-batch的模型的损失趋势会更加平滑。
损失趋势

·随机梯度下降(Stochastic Gradient Descent)

batch_size = 1,此时的梯度下降被称为随机梯度下降。

·选择mini-batch的规模

  1. 如果规模为 M M M,其中 M M M是整个训练集的规模,那么这种梯度下降就完整的Batch Gradient Descent。
  2. 如果规模为1,则称为随机梯度下降。
    在实际实现中,如果数据集比较小,当然直接选择使用Batch Gradient Descent。否则应该应用mini-batch。mini-batch的大小可以是64,128,256等等。
    不同的batch的训练进程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值