李宏毅DLHLP.06.Speech Recognition.5/7. Alignment of HMM, CTC and RNN

介绍

本门课程是2020年李宏毅老师新课:Deep Learning for Human Language Processing(深度学习与人类语言处理)
课程网站:http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html
B站视频:https://www.bilibili.com/video/BV1EE411g7Uk?t=222
公式输入请参考:在线Latex公式
本节回到End-to-end方式,上节提到的Alignment,我们来详细的对其进行讲解。
上节的时候讲HMM,使用的是State来作为最小单位,End-to-end模型则可以直接使用较大的token进行计算,也就是直接计算给定acoustic feature(声音信号)条件下,某个token sequence出现的最大概率。
在这里插入图片描述
也就是Decoding:
Y ∗ = a r g max Y l o g P ( Y ∣ X ) Y^*=arg\underset{Y}{\text{max}}logP(Y|X) Y=argYmaxlogP(YX)
在训练阶段,就是要找到一个参数 θ \theta θ,使得给定X出现正确答案 Y ^ \hat Y Y^的几率越大越好:
θ ∗ = a r g max θ l o g P θ ( Y ^ ∣ X ) \theta^*=arg\underset{\theta}{\text{max}}logP_{\theta}(\hat Y|X) θ=argθmaxlogPθ(Y^X)
由于每个分布难以穷举计算,所以一般取每个分布的前几个进行Beam Search
下面以LAS为例,进行讲解。

LAS

LAS directly computes P ( Y ∣ X ) P(Y|X) P(YX)
P ( Y ∣ X ) = p ( a ∣ X ) p ( b ∣ a , X ) . . . P(Y|X)=p(a|X)p(b|a,X)... P(YX)=p(aX)p(ba,X)...
下面就是LAS的Decoder,吃第一个context vector: c 0 c^0 c0,产生一个概率分布,橙色那个: p ( a ) p(a) p(a)
并得到这个概率分布产生a的几率。

在这里插入图片描述
a出来之后,将a和下一个context vector: c 1 c^1 c1作为Decoder的输入,得到下一个概率分布,获得b
在这里插入图片描述
b和 c 2 c^2 c2得到最后end of sentence。
在这里插入图片描述
这个例子的 P ( Y ∣ X ) P(Y|X) P(YX)的计算就是:a出现的几率乘上,给定a出现的条件下,b出现的几率,乘上给定a,b出现的条件下,EOS出现的几率

CTC,RNN-T

下面来看CTC,RNN-T如何计算 P ( Y ∣ X ) P(Y|X) P(YX),CTC,RNN-T和HMM一样需要alignment。这也是上节中提到这个技术的原因。
以CTC为例,假设输入的acoustic feature有四个,token sequence有两个:
在这里插入图片描述
我们需要在token sequence插入一些东西(一般是插入NULL或者重复值),使得token sequence与acoustic feature长度一样,例如上面的例子token sequence变成:
h = a ∅ b ∅ h=a\varnothing b\varnothing h=ab
把这四个东西对应到下面四个时间步的橙色输出。
在这里插入图片描述
然后把所有可能的alignment取出来,然后计算每个acoustic feature产生alignment的几率加起来:
P ( Y ∣ X ) = ∑ h ∈ a l i g n ( Y ) P ( h ∣ X ) P(Y|X)=\sum_{h\in align(Y)}P(h|X) P(YX)=halign(Y)P(hX)


HMM:

P θ ( X ∣ S ) = ∑ h ∈ a l i g n ( S ) P ( X ∣ h ) P_{\theta}(X|S)=\sum_{h\in align(S)}P(X|h) Pθ(XS)=halign(S)P(Xh)
CTC,RNN-T:
P θ ( Y ∣ X ) = ∑ h ∈ a l i g n ( Y ) P ( h ∣ X ) P_{\theta}(Y|X)=\sum_{h\in align(Y)}P(h|X) Pθ(YX)=halign(Y)P(hX)
对比两个对象,接下来就是要讲下面几个问题

后面的内容

如何穷举所有的alignments:1. Enumerate all the possible alignments
如何累加所有的alignments:2. How to sum over all the alignments
3.如何训练CTC,RNN-T,CTC,RNN-T是NN,需要用反向传播(GD)求解,也就是要求导,即:
θ ∗ = a r g max θ l o g P θ ( Y ^ ∣ X ) \theta^*=arg\underset{\theta}{\text{max}}logP_{\theta}(\hat Y|X) θ=argθmaxlogPθ(Y^X)
要求导:
∂ P θ ( Y ^ ∣ X ) ∂ θ = ? \cfrac{\partial P_{\theta}(\hat Y|X)}{\partial \theta}=? θPθ(Y^X)=?
4.如何测试Testing (Inference, decoding): 就是要解:
Y ∗ = a r g max Y l o g P ( Y ∣ X ) Y^*=arg\underset{Y}{\text{max}}logP(Y|X) Y=argYmaxlogP(YX)

All the alignments(穷举)

LAS是直接算,没有用alignment,我们这里对比一下HMM,CTC,RNN-T的alignments有什么不一样。
我们假设acoustic feature(6个)和token sequence(3个)如下所示。
在这里插入图片描述
下面来看3个token如何和6个acoustic feature如何进行alignment:
HMM:将token中某些值进行重复,直到长度与acoustic feature长度相同
在这里插入图片描述

CTC:将token中某些值进行重复或者插入NULL,直到长度与acoustic feature长度相同
在这里插入图片描述

RNN-T:插入T个NULL
在这里插入图片描述

穷举alignment

HMM

HMM:将token中某些值进行重复,直到长度与acoustic feature长度相同
在这里插入图片描述

For n = 1 to 𝑁
	output the n-th token 𝑡𝑛 times

constraint: t 1 + t 2 + . . . + t N = T , t n > 0 t_1+t_2+...+t_N=T,t_n>0 t1+t2+...+tN=T,tn>0
把这些alignment集合起来,可以画到一个表格中(Trellis Graph):
在这里插入图片描述
除了第一步是斜向下之外,每个列中都有两种选择,一是横着走,一个是右下走
约束是要从起点(橙色)开始,终点(蓝色)结束。下面的黑色箭头是不对的。
在这里插入图片描述
从开始到结束的所有路径就是所有alignments的集合。

CTC

CTC:将token中某些值进行重复或者插入NULL(可以在开始或者结束的地方插入NULL,NULL可以有可以没有),直到长度与acoustic feature长度相同
在这里插入图片描述

output “𝜙” 𝑐0 times
For n = 1 to 𝑁
	output the n-th token 𝑡𝑛 times
	output “𝜙” 𝑐𝑛 times

约束: t 1 + t 2 + . . . + t N + c 0 + c 1 + . . . + c N = T , t n > 0 , c n ≥ 0 t_1+t_2+...+t_N+c_0+c_1+...+c_N=T,t_n>0,c_n\geq0 t1+t2+...+tN+c0+c1+...+cN=T,tn>0,cn0
在这里插入图片描述
当在NULL位置,不能走马步(中国象棋术语)否则会跳过token
在这里插入图片描述
所以在起始点,NULL,token三种位置上有不同的走法:
在这里插入图片描述
当然,终点有两种,下面看例子:
在这里插入图片描述
在这里插入图片描述
注意:当token中有重复值的时候,就不能跳到下一个token
在这里插入图片描述

RNN-T

在这里插入图片描述

output “𝜙” 𝑐0 times
For n = 1 to N
	output the n-th token 1 times
	output “𝜙” 𝑐𝑛 times

约束: c 0 + c 1 + . . . + c N = T , c N > 0 , c n ≥ 0  for n = 1 to N − 1 c_0+c_1+...+c_N=T,c_N>0,c_n\geq 0 \text{ for n = 1 to N − 1} c0+c1+...+cN=T,cN>0,cn0 for n = 1 to N − 1
如下图所示,前面部分插入不插入NULL都可以,但是最后一定至少要有一个NULL,所有的NULL加起来要有T个。
在这里插入图片描述
右下角是有一个格子的,符合最后至少有一个NULL的约束
在这里插入图片描述
下面是两个例子。
在这里插入图片描述
注意路径不能走出表格:
在这里插入图片描述

小结

HMM:
在这里插入图片描述
CTC:开始有两个路径(虚线)
在这里插入图片描述
RNN-T:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
CTC(Connectionist Temporal Classification)和Attention是两种不同的序列建模方法,分别用于语音识别和自然语言处理等任务。下面是一个简单的实现示例: 1. CTC CTC是一种无需对齐标签的序列建模方法,常用于语音识别和手写字符识别等任务。以下是一个使用TensorFlow实现CTC的示例: ```python import tensorflow as tf from tensorflow.keras import layers # 定义模型 def ctc_model(input_dim, output_dim, units=128): input = layers.Input(shape=(None, input_dim)) lstm = layers.LSTM(units, return_sequences=True)(input) lstm = layers.LSTM(units, return_sequences=True)(lstm) output = layers.Dense(output_dim, activation='softmax')(lstm) model = tf.keras.Model(inputs=input, outputs=output) return model # 编译模型 model = ctc_model(input_dim=20, output_dim=10) model.compile(loss=tf.keras.backend.ctc_batch_cost, optimizer='adam') # 训练模型 model.fit(x_train, y_train, validation_data=(x_val, y_val), epochs=10) ``` 其中,`ctc_batch_cost`是TensorFlow中的CTC损失函数。 2. Attention Attention是一种机制,用于增强序列模型的表现力。以下是一个使用PyTorch实现Attention的示例: ```python import torch import torch.nn as nn # 定义模型 class Attention(nn.Module): def __init__(self, input_dim, hidden_dim): super(Attention, self).__init__() self.input_dim = input_dim self.hidden_dim = hidden_dim self.W = nn.Linear(input_dim, hidden_dim, bias=False) self.U = nn.Linear(hidden_dim, hidden_dim, bias=False) self.v = nn.Linear(hidden_dim, 1, bias=False) def forward(self, inputs): # inputs shape: (batch_size, seq_len, input_dim) e = torch.tanh(self.W(inputs)) # e shape: (batch_size, seq_len, hidden_dim) a = torch.softmax(self.v(e).transpose(1, 2), dim=2) # a shape: (batch_size, 1, seq_len) v = torch.bmm(a, inputs).squeeze(1) # v shape: (batch_size, input_dim) return v class Seq2Seq(nn.Module): def __init__(self, input_dim, output_dim, hidden_dim): super(Seq2Seq, self).__init__() self.encoder = nn.LSTM(input_dim, hidden_dim, batch_first=True) self.decoder = nn.LSTM(output_dim, hidden_dim, batch_first=True) self.attention = Attention(hidden_dim, hidden_dim) self.fc = nn.Linear(hidden_dim, output_dim) def forward(self, inputs, targets): # inputs shape: (batch_size, seq_len, input_dim) # targets shape: (batch_size, seq_len, output_dim) encoder_outputs, _ = self.encoder(inputs) decoder_outputs, _ = self.decoder(targets) seq_len = decoder_outputs.size(1) outputs = [] for t in range(seq_len): context = self.attention(encoder_outputs) decoder_input = decoder_outputs[:, t, :] decoder_input = torch.cat((decoder_input, context), dim=1) decoder_output, _ = self.decoder(decoder_input.unsqueeze(1)) output = self.fc(decoder_output.squeeze(1)) outputs.append(output) return torch.stack(outputs, dim=1) # 实例化模型 model = Seq2Seq(input_dim=20, output_dim=10, hidden_dim=128) criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters()) # 训练模型 for epoch in range(10): for inputs, targets in train_loader: optimizer.zero_grad() outputs = model(inputs, targets[:, :-1, :]) loss = criterion(outputs.reshape(-1, 10), targets[:, 1:, :].argmax(dim=2).reshape(-1)) loss.backward() optimizer.step() ``` 其中,`Attention`是一个自定义的Attention模块,`Seq2Seq`是一个基于LSTM和Attention的序列模型。在训练过程中,我们使用交叉熵损失函数计算模型的损失。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oldmao_2000

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值