有很长一段时间没看吴恩达老师的教程了,大概半年多前(2021年寒假期间)看完了吴恩达老师的CNN后,我便开始了各种各样的机器学习、深度学习实践(当时我暂时用不到RNN,所以看完DNN和CNN后就停了一下)。在2021这一年里,我读了很多机器学习领域的论文,我做了深度学习、联邦学习相关的竞赛,目前正在做机器学习相关的外包项目,虹膜识别框架的新思路实现,最近完成了一篇图神经网络的论文…
这学期开始学习大数据和云计算,我希望自己可以能在Hadoop和Spark环境下做RNN相关的时序预测,所以我准备最近把吴恩达老师RNN这部分的内容补起来,同时也把自己的吴恩达学习笔记补完整。
一、序列模型为什么有用?
举几个有关序列数据的例子:
- 语音识别
- 音乐生成
- 情感分类
- DNA序列分析
- 机器翻译
- 视频行为分析
- 名字主体识别
这些问题都可以看作是X->Y的监督学习,,但存在多种多种情况:X和Y有相同的长度或不同的长度,X和Y中只有X是序列或只有Y是序列…这些都是我们将接触到的序列模型。
二、符号表示(Notation)
首先举个简单的例子:
Harry Potter and Andy are friends.
要求从这个句子中获取到人名Harry Potter和Andy,那么这个句子应该如何表示其x和y呢?为了清晰地演示,我将他们放进表格里:
x | Harry | Potter | and | Andy | are | friends |
---|---|---|---|---|---|---|
y | 1 | 1 | 0 | 1 | 0 | 0 |
上面这种方式是非常简单的,可以看到人为地将人名给标记为了1,这样做可以识别出人名,并且可以很清晰地给名字一个左右界限。
其中,将序列中的每一个位置都标注为
x
<
t
>
x^{<t>}
x<t>和
y
<
t
>
y^{<t>}
y<t>的形式:
x | Harry | Potter | and | Andy | are | friends |
---|---|---|---|---|---|---|
notation | x < 1 > x^{<1>} x<1> | x < 2 > x^{<2>} x<2> | x < 3 > x^{<3>} x<3> | x < 4 > x^{<4>} x<4> | x < 5 > x^{<5>} x<5> | x < 6 > x^{<6>} x<6> |
y | 1 | 1 | 0 | 1 | 0 | 0 |
---|---|---|---|---|---|---|
notation | y < 1 > y^{<1>} y<1> | y < 2 > y^{<2>} y<2> | y < 3 > y^{<3>} y<3> | y < 4 > y^{<4>} y<4> | y < 5 > y^{<5>} y<5> | y < 6 > y^{<6>} y<6> |
x的长度表示为
T
x
T_x
Tx,y的长度表示为
T
y
T_y
Ty.
当有很多样本时,遵循前面教程中的标注标准,用上标
(
i
)
(i)
(i)表示,所以第i个序列样本中的t位置可以如下表示:
x
(
i
)
<
t
>
,
y
(
i
)
<
t
>
x^{(i)<t>}, y^{(i)<t>}
x(i)<t>,y(i)<t>
他们的长度则是:
T
x
(
i
)
,
T
y
(
i
)
T_x^{(i)}, T_y^{(i)}
Tx(i),Ty(i)
注意!
T
x
(
i
)
,
T
y
(
i
)
T_x^{(i)}, T_y^{(i)}
Tx(i),Ty(i)完全可以是不相等的,也就是输入输出不等长的情况。
来到了下一个问题, x ( i ) < t > x^{(i)<t>} x(i)<t>是一个单词,如何表示这个单词才能作为神经网络的输入呢?首先列一个词汇表(vocabulary/dictionary),然后用one-hot向量表示即可。如果遇到你词汇表中没有的词,那就需要创建一个unknown word< UNK >这样的fake word来表示。