2021 MIT || 麻省理工机器学习导论(二)
YOUTube:MIT 6.S191: Introduction to Deep Learning(要梯子,可以去B站上找找,好像也有)
这些是我在学习一点机器学习后,回过头来重新学习相关的基础,内容主要包含了上课的笔记,以及一些见解。关于各个模块更详细的内容请另寻它处,这篇笔记主要是对机器学习框架的构建。
上一节课,我们介绍了感知机,以及一些神经网络的架构。
这节课,我们开始一步一步的介绍如何利网络来处理序列数据。
序列的意义(The significance of sequence)
给你一个球,让你预测这个球接下来的运动轨迹
由于我们对球的不了解,所以我们显然只能随意的猜测。
但是,如果我们给出球之前的运动轨迹,那么我们可以有根据的预测出球接下的轨迹。
而对于序列的预测,就跟这个球的预测相似。
生活中的序列
- 音频:一段完整的音频可以被切割成一个序列
⟶ \longrightarrow ⟶
文本:一个句子可以被拆成一个个单词或字母。
时间步(time step)
每一个独立的字母或者单词,可以被看做序列中的时间步。
用处
我们可以通过序列预测生活中的很多东西:
动作预测,基因序列预测,气候预测等等
序列网络模型
这个是我们上节课中介绍的预测模型:
用于预测一个学生是否可以通过考试,这种模型并没有与序列相关。
以下三种是三种常见的序列模型
多对一
输入一段话(多个输入),得到这个句子的情绪(一个输出)
一对多
输入一张图片(一个输入),得到用一段话来描述(多个输出)
多对多
文本翻译
那么为了得到序列间的关系,网络架构应该发生怎么样的变化呢?
架构
这个是上节课我们介绍的多层感知机,它的输入x代表一个时间步
我们在接下来的介绍中将它简化为下图(我们暂且叫它细胞块)
其中 x t x_t xt代表时间步为t的输入。
我们的输入为 x t x_t xt
输出为向量 y t ^ \hat{y_t} yt^
递归的神经元
经元一个时间步的向量输入后,都会得到一个对应的输出向量。而每一个细胞块之间是不存在联系。为了获取前后时间步之间的联系,我们便把这个细胞块得到的信息传递(
每一个时间步的向量输入后,都会得到一个对应的输出向量。而每一个细胞块之间是不存在联系。为了获取前后时间步之间的联系,我们便把这个细胞块得到的信息传递(
h
t
h_t
ht)给下一个细胞块,以便于下一个细胞块在做判断的时候可以结合过去的信息。
y
^
=
f
(
x
t
,
h
t
−
1
)
\hat{y}=f(x_t,h_{t-1})
y^=f(xt,ht−1)
这个图片可以很好的体现出递归的思想:
记忆块的获取
h t = f W ( x t , h t − 1 ) h_t=f_W{(x_t,h_{t-1})} ht=fW(xt,ht−1)
f W f_W fW是带有参数的的函数(即可以通过训练改变参数)。可以理解为一些卷积+激活函数的操作。
更新隐藏状态
h t = t a n h ( W h h T h t − 1 + W x h T x t ) h_t=tanh(W^T_{hh}h_{t-1}+W^T_{xh}x_t) ht=tanh(WhhTht−1+WxhTxt)
得到输出
y ^ = W h y T h t \hat y=W^T_{hy}h_t y^=WhyTht
PS
注意,其中的参数矩阵 W h h , W h y , W x h W_{hh},W_{hy},W_{xh} Whh,Why,Wxh在不同时间步中是共用的,这样可以降低模型的大小。
优点
- 解决长变量序列
- 建立长范围的依赖
- 包含顺序信息
- 共享参数
我们把这种网络叫做Recurrent Neural Network (RNN)
RNN
我们要搭建一个预测单词循环神经网络
input
网络肯定不能直接理解单词的含义,所以我们应该把单词转化为用数字代表的向量,把数字输入网络。
我们要把每个单词转化为固定长度的向量。
one-hot
下面介绍one-hot:
- 词库中有N个词,则存在一个长的N向量
- 对于这个向量的每个下标都代表一个单词
- 如果这个要表示cat这个单词,并且cat所处的下标为2
- 那么cat这个单词就可以转化为一列长为N,除了下标为2的值为1,其他值都为0的向量(存在为1,不存在为0)
我们将词向量输入到网络中,这样我们就可以将词库中的词下标索引映射到一个低纬的空间(上图最右边),这样就可以把相关联的词汇划分在一起
当然,还有一些其他的转化方式,请自行搜索
需求
作为预测句子,它肯定要满足一下许多条件:
可以输入一定范围内任意长度的句子
可以获得长距离的信息
可以在考虑句子中词的顺序
我们看到,RNN几乎满足所以需求。
Backpropagation Through Time(BPTT)随时间的反向传播
所有的loss按照时间步的顺序,从最近的时间步到最开始的序列进行回流
在反向传播的过程中计算梯度,涉及到梯度与权重矩阵的相乘。
如果我们要计算梯度 h 0 h_0 h0,那么其中涉及到 W h h W_{hh} Whh的多次相乘。这就可能会造成一些问题。
-
梯度爆炸:许多相乘的值都>1,那么势必会导致最后的梯度变的特别大
-
梯度消失:许多值都<1则会造成,梯度变小趋近于0
在较短序列中,由于乘的权重个数较少,不易出现问题。但是RNN很明显对长序列的处理,心有余,而力不足。
解决方法
激活函数
选用ReLU为激活函数
其在x<0时梯度为0,在x>0时,梯度不变,恒为1。
所以使用ReLU函数可以防止在x>0时,f’的梯度收缩。
初始化权重
把权重初始化为单位矩阵,这样就能防止权重收缩为0
门控模块
引入一个机制,用来筛选,什么信息能通过,什么不能通过。
其现在作为循环神经网络中最常用的。
Long Short Term Memory networks(LSTMs)长短时记忆网络就是依赖这个门控机制进行搭建的。下面我们便来介绍一下LSTMs。
LSTMs
LSTMs是大多数顺序网络中主力。
这个是RNN中的结构
下面是STMLs的结构
- :点乘
- :sigmoid
注意:
门控
该模块主要是添加了一个控制信息的能力,我们来看看这个是怎么实现的。
sigmoid 是把输入转化为0到1之间。
我们可以把其看作为调制以及捕获信息,在判断信息的重要性。特别重要就为1,全部保留。无用的信息,就为0。
过程
一个LSTMs模块一共包括4步:
- Forget
忘记之前的不相关的状态
- store
得到当前与过去有关的信息
- update
更新得到 c t c_{t} ct
- Output
根据 c t − 1 h t − 1 x t c_{t-1} h_{t-1} x_t ct−1ht−1xt得到输出
通过这样的结构,网络可以更好的捕捉长距离,并且克服了梯度消失的问题
思想
-
依靠输出维护细胞状态。(Maintain a separate cell state from what is outputted)
-
使用“门控”来控制信息的流动
-
通过不间断梯度流的时间反向传播
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fJbzo2h2-1628753086407)(https://gitee.com/Black_Friday/blog/raw/master/image/G$%60(DID%5D)]%5DU%5DSEMTN65O4%7B4.png)
缺陷
- Encoding bottleneck
用于翻译的网络可能会得到一大段的输入,那么这些输入会将会是很大的向量,而将单词转化为向量的过程就会损失很多重要的信息(个人理解)
- slow,no parallelization
网络采用迭代的思想,所以运行的时间长。并且网络无法并行的在GPU上训练。
- not long memory
虽然LTMs相比于RNN在获取长文本的能力上有提升,但是对于大段的文本翻译,能力依旧欠缺。
为了克服这些困难,一种叫注意力的方法诞生了
注意力(这部分内容请自行扩展)
这是一个非常牛的思想,也是现在流行的方法,其对于大规模的序列建模问题非常有效。
它不是以往的只能通过Encoder到Decoder来访问状态向量,而是Decoder可以访问原始序列中每个时间步之后的状态 和 网络在训练过程中实践学习到的这些向量的权重(这里你可以查阅相关的Encoder-Decoder知识)。
注意力模块直接从输入中学习哪些点和哪些状态是需要注意,就能轻松的捕获长期依赖。这是因为,训练这样的网络,只需要一次通过这个注意力模块,没有时间反向传播。并且这些注意力提供的机制,是种可以学习的记忆访问。
这个模块之所以被称作注意力,是因为它在学习权重,将注意力放在输入序列的不同部分,以有效的捕捉整个原始序列中的一种可访问的记忆。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eoqlBTCY-1628753086408)(https://gitee.com/Black_Friday/blog/raw/master/image/image-20210812144539013.png)]
总结
-
RNN非常适合于序列建模任务模型序列
-
模块序列存在递归关系
-
通过时间反向传播训练RNN
-
像LSTMs这样的门控细胞让我们可以对长期依赖进行建模
-
这些模型可以用于音乐生成、分类、机器翻译等的模型
下篇2021 MIT || 麻省理工机器学习导论(三)Convolutional Neural Networks(CNN卷积神经网络)
2021年8月12日15:28:56
持续更新……