reshape(),仿射层,numpy相关函数及SGD和Adam优化器

136 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

为了督促自己每天都有进步,在这里记录下每天遇到的问题和学到的新知识,作为个人回顾使用。

日记(第二周)

20201005

关于reshape()
z.reshape(-1) 将矩阵z所有元素排成一行 z.reshape(-1,1) 将矩阵z所有元素排成一列 z.reshape(-1,2) 将矩阵z所有元素排成两列

20201007

关于仿射层 Affine Layer
仿射层是神经网络中的全连接层,其中仿射的可以看做是不同层神经元之间的相互连接,在许多方面可以被看作是神经网络的「标准」层。

仿射层的一般形式如下

y = f( wx + b)

注:x 是层输入,w 是参数,b 是一个偏差矢量,f 是一个非线性激活函数 仿射层通常被用于卷积神经网络或循环神经网络输出的最终层。

20201008

关于np.linspace()
此函数是在指定间隔内返回均匀间隔的数字 例:

# 在闭区间[2, 3]生成5个间隔相同的数字
print(np.linspace(2.0, 3.0, num=5))
# [2.   2.25 2.5  2.75 3.  ]

关于range()

>>>range(10)        # 从 0 开始到 10
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1, 11)     # 从 1 开始到 11
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> range(0, 30, 5)  # 步长为 5
[0, 5, 10, 15, 20, 25]
>>> range(0, 10, 3)  # 步长为 3
[0, 3, 6, 9]
>>> range(0, -10, -1) # 负数
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> range(0)
[]
>>> range(1, 0)
[]

关于np.prod()
对元素做乘积运算

20201009

关于np.newaxis()
插入新维度,就是增加一个维度

关于np.zeros_like()
生成一个矩阵,矩阵维度与括号内矩阵维度相同,且矩阵内值均为0

关于enumerate()
对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值。

list1 = ["这", "是", "一个", "测试"]
for index, item in enumerate(list1):
    print index, item
>>>
012 一个
3 测试

还可以指定起始值:

list1 = ["这", "是", "一个", "测试"]
for index, item in enumerate(list1, 1):
    print index, item
>>>
123 一个
4 测试

SGD+momentum
公式:

vt+1=μvtεf(θt)v_{t+1}=\mu v_t-\varepsilon\nabla f(\theta_t)
θt+1=θt+vt+1\theta_{t+1}=\theta_t+v_{t+1}

理解动量可以用滚小球的例子来理解,其中ε为learning rate.

RMSProp
在看RMSProp更新优化算法之前,我们先和AdaGrad(Adaptive Gradient)做一下对比 AdaGrad(Adaptive Gradient):

Gw=Gw+(dW)2W=WαGw+εdWG_w=G_w+(dW)^2\newline W=W-\frac{\alpha}{\sqrt{G_w}+\varepsilon}\cdot dW
Gb=Gb+(db)2b=bαGb+εdbG_b=G_b+(db)^2\newline b=b-\frac{\alpha}{\sqrt{G_b}+\varepsilon}\cdot db

这个优化算法是为了解决改变学习率的问题,学习率如果是不变的话,每次更新的步长都一样,然而我们希望一开始学习率大一些,以便我们可以更快的收敛,而在后面学习率可以小一些,这样使结果更加准确。 上式中GwG_w是梯度,也就是说把学习率除以之前所有梯度的平方和。 但是这样的方式可能会使学习率过早地降低,我们可以通过RMSProp来解决。 RMSProp:

sdw=βsdw+(1β)dW2sdb=βsdb+(1β)db2s_{dw}=\beta s_{dw}+(1-\beta)dW^2\newline s_{db}=\beta s_{db}+(1-\beta)db^2
W=WαdWsdw+εb=bαdbsdb+εW=W-\alpha\frac{dW}{\sqrt{s_{dw}}+\varepsilon}\newline b=b-\alpha\frac{db}{\sqrt{s_{db}}+\varepsilon}

β\beta是一个衰减率,一般们设置为0.9或0.99,ε\varepsilon是一个极小值,用来防止分母为0。

Adam
Adam是一种吧momentum和RMSProp结合到一起的算法。

批量归一化BN(Batch Normalization)
BN就是在每一层网络对数据做归一化处理,这样可以大大提高训练的速度。 BN的预处理近似于白化处理:

x^(k)=x(k)E[x(k)]Var[x(k)]\hat{x}^{(k)}=\frac{x^{(k)}-E[x^{(k)}]}{\sqrt{Var[x^{(k)}]}}

上式中,分子E[x(k)]E[x^{(k)}]是每一批训练数据神经元x(k)x^{(k)}的平均值,分母是每一批数据神经元x(k)x^{(k)}激活度的标准差。 可是,这样的操作使得在这一层学习到的参数被破坏了,这样岂不是白学习了吗?因此我们还需要引入可学习参数γ,β\gamma,\beta.

y(k)=γ(k)x^(k)+β(k)y^{(k)}=\gamma^{(k)}\hat{x}^{(k)}+\beta^{(k)}

每个神经元x(k)x^{(k)}都有一对参数γ\gammaβ\beta,当:

γ(k)=Var[x(k)]β(k)=E[x(k)]\gamma^{(k)}=\sqrt{Var[x^{(k)}]}\newline \beta^{(k)}=E[x^{(k)}]

时,就可以恢复所学习到的特征,这样,BN层前向传播过程公式就是: 在这里插入图片描述