趋近智
通过连接主义时间分类(CTC),可将各个组件组装成一个可训练的声学模型。主要目标是设计一个神经网络,它能将音频特征序列转换为字符词汇上的概率分布序列。这个输出正是CTC损失函数计算损失并训练网络所需。
一个标准的基于CTC的模型是多个神经网络层的堆叠,每个层都有其特定的职责。此架构旨在处理语音的序列性和可变长度特性。
该模型通常由三个主要部分构成:用于处理序列的循环层、用于将特征投射到词汇空间的线性层,以及用于生成概率分布的Softmax层。
数据在典型的基于CTC的声学模型中的流向。特征序列经过循环层处理,投射到词汇维度,并转换为概率。然后,CTC损失函数将此输出与目标文本进行比较,以训练模型。
我们来逐一分析此架构的每个组件。
声学模型的主要组成部分是一系列循环层,最常见的是长短期记忆(LSTM)或门控循环单元(GRU)网络。选择这些层是因为语音本质上是序列化的;某个时刻声音的含义通常取决于它之前和之后的声音。
这个循环主体的输入是特征序列批次,通常形状为(批次大小, 时间步, 特征数量)。输出是隐藏状态的新序列,每个时间步对应一个。如果使用隐藏层大小为H的双向LSTM,每个序列的输出形状将是(时间步, 2 * H)。
在循环层处理完音频特征并捕获时间模式后,我们需要将其输出映射到我们所需的词汇。这通过一个标准的完全连接(或称“全连接”)层完成。
此层独立应用于LSTM输出序列中的每个时间步。这通常被称为“时间分布”全连接层。它的作用是获取每个时间步的隐藏状态,并将其投射到一个向量中,该向量的长度等于词汇表大小加一。
<blank>标记。如果我们的字符集有28个符号,则此层的输出维度将是29。此层在每个时间步的输出是一个由原始、未归一化分数组成的向量,称为logits。对于一个批次,此层的输入可能是(批次大小, 时间步, 2 * H),其输出将是(批次大小, 时间步, 词汇大小 + 1)。
模型内的最后一步是将全连接层输出的原始logit分数转换为概率。将Softmax激活函数应用于输出张量的最后一个维度(词汇维度)。
对于每个时间步,Softmax函数将logit向量归一化为概率分布,所有值介于0和1之间且总和为1。结果张量通常被称为发射矩阵或概率矩阵,其形状为(批次大小, 时间步, 词汇大小 + 1)。(t, c)处的每个条目代表在时间步t观察到字符c的概率。
此概率矩阵是训练期间声学模型的最终输出,也是CTC损失函数所需的输入。
在PyTorch或TensorFlow这样的框架中,您可以将此架构定义为一系列层。以下示例呈现了PyTorch中的简化结构。
import torch
import torch.nn as nn
class CTCAcousticModel(nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim, n_layers=2):
super(CTCAcousticModel, self).__init__()
# 用于处理特征序列的循环层
self.lstm = nn.LSTM(
input_size=input_dim,
hidden_size=hidden_dim,
num_layers=n_layers,
bidirectional=True,
batch_first=True # 期望输入为 (批次, 序列, 特征)
)
# 将LSTM输出映射到词汇大小的全连接层
# 输入维度是 hidden_dim * 2,因为LSTM是双向的
self.fc = nn.Linear(hidden_dim * 2, output_dim)
def forward(self, x):
# x 形状: (批次, 时间步, 特征数量)
# 将输入通过LSTM层
lstm_out, _ = self.lstm(x)
# lstm_out 形状: (批次, 时间步, hidden_dim * 2)
# 将每个时间步的输出通过全连接层
logits = self.fc(lstm_out)
# logits 形状: (批次, 时间步, 输出维度)
# 大多数CTC损失实现为了数值稳定性,期望对数概率
return nn.functional.log_softmax(logits, dim=2)
这个类封装了整个流程。它接收一个特征序列批次,并返回一个对数概率矩阵批次,这些矩阵已准备好与真实转录本一起传递给CTC损失函数。在下一节中,我们将在实践环节中结合所有这些来训练我们的第一个声学模型。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造