理解序列模型

使用 Keras 的机器翻译

Thushan Ganegedara

Data Scientist and Author

时间序列输入与序列模型

  • 句子是时间序列输入
    • 当前词受前文影响
    • 例如:He went to the pool for a ....
  • 编码器/解码器使用机器学习模型
    • 能从时间序列输入学习的模型
    • 称为"序列模型"
使用 Keras 的机器翻译

序列模型

  • 序列模型
    • 逐步遍历输入,并在每个时间步产生输出

序列模型结构

使用 Keras 的机器翻译

作为序列模型的编码器

  • GRU:门控循环单元

门控循环单元

使用 Keras 的机器翻译

GRU 层简介

在时间步 1,GRU 层:

  • 消耗输入 "We"
  • 消耗初始状态 (0,0)
  • 输出新状态 (0.8, 0.3)

GRU 1

使用 Keras 的机器翻译

GRU 层简介

在时间步 2,GRU 层:

  • 消耗输入 "like"
  • 消耗初始状态 (0.8,0.3)
  • 输出新状态 (0.5, 0.9)

隐藏状态表示模型已看到内容的"记忆"

GRU 2

使用 Keras 的机器翻译

Keras(函数式 API)速览

  • Keras 有两个重要对象:LayerModel
  • 输入层
    • inp = keras.layers.Input(shape=(...))
  • 隐藏层
    • layer = keras.layers.GRU(...)
  • 输出
    • out = layer(inp)
  • 模型
    • model = Model(inputs=inp, outputs=out)
使用 Keras 的机器翻译

理解数据形状

  • 序列数据是三维的
    • 批量维(如句子组)
    • 时间维——序列长度
    • 输入维(如 one-hot 向量长度)
  • GRU 模型输入形状
    • (Batch, Time, Input)
    • (批大小, 序列长度, one-hot 长度)

输入数据

使用 Keras 的机器翻译

用 Keras 实现 GRU

定义 Keras 层

inp = keras.layers.Input(batch_shape=(2,3,4))
gru_out = keras.layers.GRU(10)(inp)

定义 Keras 模型

model = keras.models.Model(inputs=inp, outputs=gru_out)
使用 Keras 的机器翻译

用 Keras 实现 GRU

使用 Keras 模型预测

x = np.random.normal(size=(2,3,4))
y = model.predict(x)
print("shape (y) =", y.shape, "\ny = \n", y)
shape (y) = (2, 10) 
y = 
[[ 0.2576233   0.01215531  ... -0.32517594  0.4483121 ],
 [ 0.54189587 -0.63834655  ... -0.4339783   0.4043917 ]]
使用 Keras 的机器翻译

用 Keras 实现 GRU

批量大小可变的 GRU

inp = keras.layers.Input(shape=(3,4))
gru_out = keras.layers.GRU(10)(inp)
model = keras.models.Model(inputs=inp, outputs=gru_out)
x = np.random.normal(size=(5,3,4))
y = model.predict(x)
print("y = \n", y)
y = 
 [[-1.3941444e-02 -3.3123985e-02 ... 6.5081201e-02  1.1245312e-01]
 [ 1.1409521e-03  3.6983326e-01 ... -3.4610277e-01 -3.4792548e-01]
 [ 2.5911796e-01 -3.9517123e-01 ... 5.8505309e-01  3.6908010e-01]
 [-2.8727052e-01 -5.1150680e-02 ... -1.9637148e-01 -1.5587148e-01]
 [ 3.1303680e-01  2.3338445e-01 ... 9.1499090e-04 -2.0590121e-01]]
使用 Keras 的机器翻译

GRU 层的 return_state 参数

inp = keras.layers.Input(batch_shape=(2,3,4))
gru_out2, gru_state = keras.layers.GRU(10, return_state=True)(inp)
print("gru_out2.shape = ", gru_out2.shape)
print("gru_state.shape = ", gru_state.shape)
gru_out2.shape =  (2, 10)
gru_state.shape =  (2, 10)

GRU return_state

使用 Keras 的机器翻译

GRU 层的 return_sequences 参数

inp = keras.layers.Input(batch_shape=(2,3,4))
gru_out3 = keras.layers.GRU(10, return_sequences=True)(inp)
print("gru_out3.shape = ", gru_out2.shape)
gru_out3.shape =  (2, 3, 10)

GRU return_sequences

使用 Keras 的机器翻译

Vamos praticar!

使用 Keras 的机器翻译

Preparing Video For Download...