2021-05-09 ch18 RNN

2021-05-11  本文已影响0人  柠樂helen

输入 x1 单词对应一个embedding,Ex1
输出 y' = [y1', y2', ...] (任务不同,使用的y不同:词性标注,每个y'都要;情感分类,仅需要最后一个yt')
隐层 h2 = tanh(w_h1*h1 + w_xh2 * Ex2 + b_l1)
y2' = g(w_hy2 * h2 + b_l2)
y2' 是 (0.01, 0.02, 0.001, ....) R|V|, 词库里每个单词的概率
groundtruth y2 = (0,0,1,...) R|V|, 表示x3这个词的独热编码
损失函数 l_t2 = loss(y2, y2')

需要学习的参数:{ W_xh, W_h, W_hy, b_ln, Ex}

image.png

语言模型回顾:P_lm(S) = P_lm(w1,w2,...,wn)

为什么RNN会出现梯度爆炸或者消失的问题?
1.RNN是深度学习模型,在时间维度上的叠加,和普通的NN堆叠不一样。当然也可以在空间上堆叠多层

梯度消失和梯度爆炸

LSTM

"""
LSTM伪代码
"""
def LSTMCell(x, h, c):
    data = concat(h,x)
    # 遗忘门
    forget_gate = sigmoid(W_f · data + b_f)
    # 输入门
    input_gate = sigmoid(W_i · data + b_i)
    # 输出门
    output_gate = sigmoid(W_o · data + b_o)
    # 生成候选记忆
    c_t~ = tanh(W_c  · data + b_c)
    # 生成当前记忆
    c_t = forget_gate · c_t-1 + input_gate · c_t~
    #  输出
    ht = output_gate · tanh(c_t)
    return ct, ht

image.png
image.png

情感分类代码


网络定义 image.png

depth(num_layers) 指的是多层LSTM,一般只有一层。


LSTM API结构

关于h0 c0初始化:

image.png 调用示例

一般翻译的话用 output,分类用hn

image.png

self.decoder 是一个二分类,单向LSTM的话,需要*2,是因为二分类
from_pretrained(), 用一个已经训练好的weight
require_grad = False, weight不需要梯度下降来更新
permute ,维度调换
初始状态和最终状态concate 是因为是双向LSTM

导入初始weight 训练过程1
训练过程2

扩展API


image.png image.png
上一篇下一篇

猜你喜欢

热点阅读