Hubble Zhang的学习日记(第二周)

    科技2022-08-01  109

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

    目录

    日记(第二周)20201005202010072020100820201009

    日记(第二周)

    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 公式: v t + 1 = μ v t − ε ∇ f ( θ t ) v_{t+1}=\mu v_t-\varepsilon\nabla f(\theta_t) vt+1=μvtεf(θt) θ t + 1 = θ t + v t + 1 \theta_{t+1}=\theta_t+v_{t+1} θt+1=θt+vt+1 理解动量可以用滚小球的例子来理解,其中ε为learning rate.

    RMSProp 在看RMSProp更新优化算法之前,我们先和AdaGrad(Adaptive Gradient)做一下对比 AdaGrad(Adaptive Gradient): G w = G w + ( d W ) 2 W = W − α G w + ε ⋅ d W G_w=G_w+(dW)^2\newline W=W-\frac{\alpha}{\sqrt{G_w}+\varepsilon}\cdot dW Gw=Gw+(dW)2W=WGw +εαdW G b = G b + ( d b ) 2 b = b − α G b + ε ⋅ d b G_b=G_b+(db)^2\newline b=b-\frac{\alpha}{\sqrt{G_b}+\varepsilon}\cdot db Gb=Gb+(db)2b=bGb +εαdb 这个优化算法是为了解决改变学习率的问题,学习率如果是不变的话,每次更新的步长都一样,然而我们希望一开始学习率大一些,以便我们可以更快的收敛,而在后面学习率可以小一些,这样使结果更加准确。 上式中 G w G_w Gw是梯度,也就是说把学习率除以之前所有梯度的平方和。 但是这样的方式可能会使学习率过早地降低,我们可以通过RMSProp来解决。 RMSProp: s d w = β s d w + ( 1 − β ) d W 2 s d b = β s d b + ( 1 − β ) d b 2 s_{dw}=\beta s_{dw}+(1-\beta)dW^2\newline s_{db}=\beta s_{db}+(1-\beta)db^2 sdw=βsdw+(1β)dW2sdb=βsdb+(1β)db2 W = W − α d W s d w + ε b = b − α d b s d b + ε W=W-\alpha\frac{dW}{\sqrt{s_{dw}}+\varepsilon}\newline b=b-\alpha\frac{db}{\sqrt{s_{db}}+\varepsilon} W=Wαsdw +εdWb=bαsdb +εdb β \beta β是一个衰减率,一般们设置为0.9或0.99, ε \varepsilon ε是一个极小值,用来防止分母为0。

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

    批量归一化BN(Batch Normalization) BN就是在每一层网络对数据做归一化处理,这样可以大大提高训练的速度。 BN的预处理近似于白化处理: x ^ ( k ) = x ( k ) − E [ x ( k ) ] V a r [ x ( k ) ] \hat{x}^{(k)}=\frac{x^{(k)}-E[x^{(k)}]}{\sqrt{Var[x^{(k)}]}} x^(k)=Var[x(k)] x(k)E[x(k)] 上式中,分子 E [ x ( k ) ] E[x^{(k)}] E[x(k)]是每一批训练数据神经元 x ( k ) 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)} y(k)=γ(k)x^(k)+β(k) 每个神经元 x ( k ) x^{(k)} x(k)都有一对参数 γ \gamma γ β \beta β,当: γ ( k ) = V a r [ x ( k ) ] β ( k ) = E [ x ( k ) ] \gamma^{(k)}=\sqrt{Var[x^{(k)}]}\newline \beta^{(k)}=E[x^{(k)}] γ(k)=Var[x(k)] β(k)=E[x(k)] 时,就可以恢复所学习到的特征,这样,BN层前向传播过程公式就是:

    Processed: 0.010, SQL: 8