深度学习基本概念

1.深度学习基本概念

1.1 张量

我们在学习线性代数的时候,学习过向量和矩阵。对于张量从数学和物理方面讲解就篇幅过长。我们可以简单的理解张量(Tensor)为向量以及矩阵的扩展。向量可以理解为一维张量,矩阵可以理解为二维张量。对于更高阶的可以以深度学习里常要处理的图片来举例。彩色图片有(RGB)三个通道,可以看作一个三维张量即H*W*C,(H为高度,w为宽带,c是通道数目)。在深度学习里常使用四维的张量,NCHW或NHWC两种其中N为批次的大小。

在深度学习的网络构造过程中,会遇到各种各样的线性变换,这些线性变换的过程主要分为两类:一是对张量(包括向量和矩阵)的线性变换。另一种是张量的逐点运算。一般来说在神经网络的构造中,都是一系列的线性变换和非线性的激活函数的运算交错进行叠加,最终构造出包含很多参数的非线性模型,其中可训练的是线性变换的系数。

对于张量的存储,假设有一个K维的张量( n 1 , n 2 , ⋯   , n k n_1 , n_2, \cdots ,n_k n1,n2,,nk),实际存储的是一维的向量。实际的排列方式可以从两个方向开始,从 n 1 n_1 n1 n k n_k nk 或者从 n k n_k nk n 1 n_1 n1 一般选择从 n k n_k nk 开始。

1.2 神经元

神经网络最基础的组成单位可以认为是一个神经元(Neuron),它的结构由数个输入和输出组成。一个神经元的输入是之前神经元的输入组合 x = ∑ w i a i x=\sum w_ia_i x=wiai 其中 w i w_i wi 是一系列的可训练参数,称之为神经网络的权重。该神经元随之对这个线性组合输出的结果做一个非线性的函数变换 f ( x ) f(x) f(x) ,输出该函数的变换结果。非线性的函数又称之为激活函数。

2.输入数据的表示

对于日常生活中接触到的图像,文本和语音要通过预处理转换成浮点数的形式才能输入神经网络进行计算。

2.1 图像数据的表示方式

图像数据可以表示为像素点的集合,每个像素点可以有一个灰度(GrayScale)、三个(RGB)、或者四个(RGBA)通道,单个像素点的通道的取值决定了像素可以表示的对比度的大小,取0~255范围的值。于是,一张图片可以表示为 h × w × c h \times w \times c h×w×c的三维张量。由于图片的大小可能不一致,所以神经网络在训练过程中一般会同时批处理很多的图片通过插值法将其修改为相同的大小。在调整图片大小前还可能将裁剪一部分区域,或是将RGB转换为HSV然后在这三个值上做5%到10%的随机增减,再变回RGB(这样做是为了扩增数据集,提升数据集的泛化能力。同时也会对数据进行归一化处理。

2.2 文本数据的表示

文本转换为数值张量需要一定的预处理。首先是进行分词,将连续的文本转换为单词的序列。然后是去停词,停词就是出现频率高但是对文本实际意义没有太大关联的词。之后要做正则化处理,就是把不同的文本形式转换为一致的文本形式。最后把预处理的结果转化为词向量,这个过程称之为词嵌入(Embedding)。

3. 线性变换和激活函数

3.1 线性变换

线性变换有全连接线性变换和卷积线性变换。对于全连接线性变换,可以举个例子,比如从某一层为长度为3的向量,而下一层是大小是长度为4的向量,这时就需要有一个 4 × 3 4 \times 3 4×3的矩阵来将其转换。卷积线性变换就是让一部分区域和卷积核的一部分权重按照一一对应的方式相乘然后求和得到最后的输出。

3.2激活函数

根据线性代数的知识,线性变换的组合还是线性变换。因此仅通过组合全连接层或是卷积层,最后得到的结果仍然是线性变换的组合,可以等价为一个线性变换,因此这对于神经网络模型是没有意义的。为了能够让神经网络具有非线性的特性,我们应该加入非线性层。理论上所有的非线性函数都可以作为激活函数,但是我们常用的激活函数是Sigmod,Tanh函数和ReLU函数。其中 σ ( x ) = 1 1 + e − x \sigma (x) = \frac {1}{1 + e^{-x}} σ(x)=1+ex1 , t a n h ( x ) = 1 − e − x 1 + e − x tanh(x) = \frac{1-e^{-x}}{1+e^{-x}} tanh(x)=1+ex1ex , R e L U ( x ) = m a x ( 0 , x ) ReLU(x) = max(0, x) ReLU(x)=max(0,x) 。这是输入层和隐藏层之间的激活函数。

3.链式求导法则和反向传播

优化深度学习模型的过程是优化模型的权重,从而让损失函数尽可能小的过程。可以把损失函数看作有两种参数的函数,一种是输入的数据另一种是线性变换的权重,如果想要得到最优的权重可以求得损失函数对于权重的倒数,然后沿着导数放行进行变化。

3.1基于链式求导的梯度计算

由于损失函数是所有中间层权重的复合函数,并且模型的计算是逐层叠加在一起的,我们可以不断通过递推进行求导。我们可以设递推式为 h j + 1 = f j ( W j h j ) h_{j+1}=f_j(W_jh_j) hj+1=fj(Wjhj) 。同时假设最后的损失函数为 L = f n ( h n ) L=f_n(h_n) L=fn(hn) 是输出层神经元值得函数,我们对两边进行求导,可以得到对应导数的递推式 ∂ L ∂ W i = ∂ L ∂ h j + 1 ∂ h j + 1 ∂ W j = ( ∂ L ∂ h j + 1 ⊙ ∂ f j ( W j h j ) ∂ W j h j ) h j T \frac{\partial L}{\partial W_i}=\frac{\partial L}{\partial h_{j + 1}}\frac{\partial h_{j + 1}}{\partial W_j}=(\frac{\partial L}{\partial h_{j + 1}}\odot \frac{\partial f_j(W_jh_j)}{\partial W_jh_j})h_j^T WiL=hj+1LWjhj+1=(hj+1LWjhjfj(Wjhj))hjT 以及 ∂ L ∂ h i = ∂ L ∂ h j + 1 ∂ h j + 1 ∂ W j = W j T ( ∂ L ∂ h j + 1 ⊙ ∂ f j ( W j h j ) ∂ W j h j ) \frac{\partial L}{\partial h_i}=\frac{\partial L}{\partial h_{j + 1}}\frac{\partial h_{j + 1}}{\partial W_j}=W_j^T(\frac{\partial L}{\partial h_{j + 1}}\odot \frac{\partial f_j(W_jh_j)}{\partial W_jh_j}) hiL=hj+1LWjhj+1=WjT(hj+1LWjhjfj(Wjhj)) .这两个式子用于反向传播过程。

3.2 激活函数的导数

对于反向传播,我们也需要激活函数的导数,几个常见的激活函数的导数是 σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \sigma'(x)=\sigma(x)(1-\sigma(x)) σ(x)=σ(x)(1σ(x)) , t a n h ′ ( x ) = 1 − t a n h 2 ( x ) tanh'(x) = 1-tanh^2(x) tanh(x)=1tanh2(x)

, R e L U ′ ( x ) = { 0 , x ≤ 0 1 , x ≥ 0 ReLU'(x) = \begin{cases} 0 ,x \leq 0 \\ 1,x \ge 0 \\ \end{cases} ReLU(x)={0,x01,x0 ,接下来介绍下梯度消失和梯度爆炸。梯度消失是随着网络的层数变多我们最终求得的导数变为零或是变得非常大。对于深度学习模型来说,基本上就是几十上百层神经网络叠加在一起,如果使用Sigmod和Tanh函数作为激活函数,那么前面几层的的权重梯度就会非常接近于零。为解决这个问题其中一个方法就是使用ReLU作为激活函数。其实其实梯度爆炸和梯度消失问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。解决问题的核心是让下一层的数据的绝对值尽可能分布在1附近。

4.优化器

之前讲过梯度的求解,为什么要计算神经网络中的权重梯度,其目的是为了在后续的算法中使用梯度下降算法进行优化。接下来需要讲解下梯度下降算法是如何工作的。根据微积分的知识,在函数的极小值附近,如果沿着函数的梯度方向行走,函数的值是下降,然后最终会收敛致极小值。更新的公式 L ( w ′ ) < L ( w ) , w ′ = w − α ∂ L ∂ w L(w') < L(w),w'=w-\alpha\frac{\partial L}{\partial w} L(w)<L(w),w=wαwL.

而在深度学习的过程中,经常会遇到训练的数据量很大的情况。如果每轮对所有的数据进行更新权重,这是不现实的。为了在这种情况下对其优化,一般采用迷你批次的数据来估算神经网络的权重梯度,然后根据估算的梯度来对模型进行进行梯度下降优化,由于每个批次的梯度并不能代表所有的数据的梯度,只能代表所有数据的数据的近似,这种优化算法叫做随机梯度下降算法(Stochastic Gradient Descent,SGD).

随机梯度下降算法使用的是近似梯度,所以在使用时会有一定的不稳定性,而且有可能会导致算法的收敛速度降低。这时就需要一系列的优化算法来加快算法的收敛速度并提高稳定性。下面介绍几个常用的优化算法。

1.基于动量的优化算法

首先得讲解动量这个概念。我们知道之所以迷你批次的方法不准确是由于没有所有批次的梯度信息,所以我们需要在梯度中引入历史信息。我们用下式来计算动量和更新权重。其中动量的初始值为0.

m t = γ m t − 1 + α ∂ L ∂ w t m_t=\gamma m_{t-1}+\alpha \frac{\partial L}{\partial w_t} mt=γmt1+αwtL, w t + 1 = w t − m t w_{t+1}=w_t-m_t wt+1=wtmt

2.AdaGrad

G t = ∑ i = 1 t ( ∂ L ∂ w i ) 2 G_t=\sum_{i=1}^t(\frac{\partial L}{\partial w_i})^2 Gt=i=1t(wiL)2

w t + 1 = w t − α ∂ L ∂ w i G t + ε w_{t+1} = w_t - \frac{\alpha \frac{\partial L}{\partial w_i}}{\sqrt{G_t+\varepsilon}} wt+1=wtGt+ε αwiL

3.RMSProp

v t = γ v t − 1 + ( 1 − γ ) ( ∂ L ∂ w ) 2 v_t = \gamma v_{t-1}+(1-\gamma)(\frac{\partial L}{\partial w})^2 vt=γvt1+(1γ)(wL)2

w t + 1 = w t − α v t + ε ∂ L ∂ w w_{t+1}=w_t-\frac{\alpha}{\sqrt{v_t+\varepsilon}}\frac{\partial L}{\partial w} wt+1=wtvt+ε αwL

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值