CS224n笔记12 语音识别的end-to-end模型

2023-11-22 14:50

本文主要是介绍CS224n笔记12 语音识别的end-to-end模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文转自:http://www.hankcs.com/nlp/cs224n-end-to-end-asr.html

  这次斯坦福请到了深度学习教父Hinton的弟子Navdeep来讲语音识别,他正在英伟达工作,怪不得N卡在深度学习中的地位如此之高。而他本人也在用Dell的搭载了N卡的XPS跑Ubuntu,一改以往“讲台必定信仰灯”的局面。

Automatic Speech Recognition(ASR)

ASR就是将声学信号转化为文本的系统。

hankcs.com 2017-07-01 上午10.40.18.png

语音是一种自然的用户接口:

2017-07-01_10-42-10.png

传统ASR

传统做法的主体是生成式语言模型,建模声学信号与文本的发音特征的联合概率,但pipeline的不同部分掺杂了不同的机器学习模型:

hankcs.com 2017-07-01 上午10.49.02.png

近现代ASR

神经网络兴起之后,人们发现传统pipeline中的每个模型都可以被一种对应的神经网络所替代,并且取得更好的效果:

hankcs.com 2017-07-01 上午10.52.23.png

但是这么多混乱的目标函数各自为政,难免有顾此失彼的情况。这构成一种动机,为什么不用一个统一的大模型来取代这盘散沙呢?

end-to-end ASR

直接从音频到字符的概率模型$p(Y|X)$:

hankcs.com 2017-07-01 上午10.58.05.png

(上半部分与生成式模型作对比)

Connectionist Temporal Classification

这是一种强大的概率模型,特别适用于语音识别。其主体是一个Bidirectional RNN,上面是一层softmax。

hankcs.com 2017-07-01 上午11.07.28.png

词表中还有一个空格<b>,这很重要。

由于语音片段(帧)切割时的随意性,可能导致一个字符c被切割为多个帧,每个帧都输出c。为了区分字符与字符的界限,所以引入空格分隔符。在解码的时候还需要限制字符只能转移到相同的字符,或者空格。

hankcs.com 2017-07-01 上午11.15.15.png

解码时的直观演示:

2017-07-01_11-24-13.png

灰色线条表示无输出的概率。

一些效果

2017-07-01_11-28-56.png

hankcs.com 2017-07-01 下午4.06.20.png

hankcs.com 2017-07-01 下午4.07.03.png

可见识别结果听上去挺像那么回事,可拼写不正确。Google通过在训练时集成语言模型进去修正了这些问题。而且不再使用字符级别,而是使用单词级别的大词表,识别出可能的单词后,用语言模型挑出最可能的句子。

2017-07-01_16-15-12.png

虽然这是个end-to-end模型,但还是掺杂了一个语言模型。没有语言模型的帮助,该CTC模型无法根据已识别的单词做条件调整下次预测。

sequence to sequence speech recognition with attention

让语言模型也成为模型天然的一部分,将音频视作sequence,文本视作另一个sequence,类似于NMT中的encoder-decoder,LSTM模型根据之前的y和全部x预测下一个y:

2017-07-01_16-21-00.png

一下子把x都喂进去后,对于很长的序列来讲,需要做attention,在不同的时刻关注输入的不同部分:

hankcs.com 2017-07-01 下午4.25.45.png

由于是RNN,所以输入x依然不是定长的。

Listen Attend and Spell

定义score函数,接受每个历史时刻的encoder隐藏状态$h_t$和decoder的当前状态$s$,得到当前应当对每个历史时刻倾注多少注意力。softmax归一化,加权和得到最终的context vector,参与预测。

hankcs.com 2017-07-01 下午4.32.39.png

这里的encoder是树形的,因为对于较长的语音来讲,要softmax的timestep实在太多,效率不高、模型注意力被分散。通过用softmax把相邻的timestep总结一下,提高了效率和效果。

这个模型是强大的,学习到了很多pattern:

hankcs.com 2017-07-01 下午4.40.29.png

还可能产生一个读音的不同拼写(取决于早期的预测结果,然后导致不同的attention):

2017-07-01_16-45-01.png

2017-07-01_16-45-28.png

效果

得到的效果虽然没有超越多年优化的旧模型,但也是一个量级的:

hankcs.com 2017-07-01 下午4.47.51.png

LAS的限制

  • 必须等到用户说完话之后才能开始识别

  • attention是计算瓶颈

  • 输入的长度对准确率影响特别大

hankcs.com 2017-07-01 下午4.50.42.png

在线seq2seq模型

希望能够即时产生输出,并且不需要在整个sequence上分配attention。

Neural Transducer

根据一个定长的输入序列片段产生输出,不要要前一个输出,依然需要空白符,依然需要alignment(哪些字母属于一个词):

hankcs.com 2017-07-01 下午5.05.23.png

用空白符隔开的区块只是一个字符,究竟哪些字符成词,又回到了老生常谈的“分词”问题上来。这里采用了柱搜索找出最可能的路径。

hankcs.com 2017-07-01 下午5.10.55.png

训练的时候理论上有一个非常复杂的对数似然的梯度,但实际上经常只取对齐,不做识别上的求和:

hankcs.com 2017-07-01 下午5.15.10.png

对齐的过程类似viterbi,但并不严格是,我们是在找最优路径,但路径与之前的每个选择都有关。柱搜索不太理想,如果记录到每个block(字符)为止产生特定数量token的最大概率,则可以用动态规划解决:

hankcs.com 2017-07-01 下午5.22.56.png

结果

hankcs.com 2017-07-01 下午5.25.36.png

在有attention的情况下,窗口大小影响不大;而在无attention的情况下,窗口较小效果较好。

Encoder中的卷积

与其简单地层叠两个timestep,不如喂给很深的卷积网络:

2017-07-01_19-06-34.png

效果显著:

hankcs.com 2017-07-01 下午7.08.28.png

目标颗粒度

有很多选择:

hankcs.com 2017-07-01 下午7.10.38.png

但对语音识别来讲,更有用的是字符的ngram(相当于音节):

hankcs.com 2017-07-01 下午7.11.43.png

它们有指数级的组合可能,不清楚哪一种是最好的:

hankcs.com 2017-07-01 下午7.14.31.png

对于end-to-end模型来讲,常用的手法是由模型自动决定ngram的分割:

hankcs.com 2017-07-01 下午7.15.34.png

效果

hankcs.com 2017-07-01 下午7.18.36.png

上表的ngram代表“最大产生ngram”的意思。

hankcs.com 2017-07-01 下午7.19.47.png

模型缺点

在句子开头和人名地名处困惑度较高:

hankcs.com 2017-07-01 下午7.23.08.png

在词语分界处的错误自信会导致搜索时的错误,连语言模型也无力回天。

解决办法

通过惩罚softmax输出概率1来Entropy Regularization正则化模型,可以克服这个问题:

hankcs.com 2017-07-01 下午7.26.50.png

与其直接ER,不如让输出的分布尽量与Unigram的分布相似,这样效果更好了。

另一个缺点

另一个问题是,模型偏向于惩罚生成很长的输出,这对很长的输入来讲会出现提前终止输出的情况:

hankcs.com 2017-07-01 下午7.30.51.png

比如:

hankcs.com 2017-07-01 下午7.32.21.png

解决办法是在预测时惩罚那些不看输入的情况,未处理的输入越多,惩罚越大。

这种粗暴的方法还是取得了一些效果提升:

hankcs.com 2017-07-01 下午7.36.12.png

Better Language Model Blending

标注音频-字幕数据毕竟不如海量的未标注文本多,而end-to-end模型是一个自治的大模型,内部隐式地存在通过标注数据学习到的语言模型。在哪里如何与外部语言模型混合呢?

答案是在decoder的softmax预测结果的对数概率上线性混合:

2017-07-01_19-41-02.png

还有很多种混合手段,也是个新的前沿课题。

Better Sequence Training

上节课提到的ground truth问题,除了scheduled sampling之外,还有一些拓展。比如Reinforement Learning之类(草草提了两句)。

机会

一些研究方向了。

多音源

鸡尾酒舞会上有很多人说话,能否都识别出来呢?以前的生成式模型心中有一个固定的模式去生成数据与输入对比,不适合这个任务。现在常用的判别式模型反过来,以输入特征预测结果,应该可以做出以前做不到的成绩。

hankcs.com 2017-07-01 下午7.51.52.png

"同声传译"

接受法语音频,直接输出英文文本。相当于将上面提到的模型与MT模型blend到一起了:

hankcs.com 2017-07-01 下午7.53.43.png

两者分别对原文和音频的对齐是非常类似的:

hankcs.com 2017-07-01 下午7.55.27.png

转载于:https://www.cnblogs.com/koocn/p/7701653.html

这篇关于CS224n笔记12 语音识别的end-to-end模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/410908

相关文章

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

使用Python实现文本转语音(TTS)并播放音频

《使用Python实现文本转语音(TTS)并播放音频》在开发涉及语音交互或需要语音提示的应用时,文本转语音(TTS)技术是一个非常实用的工具,下面我们来看看如何使用gTTS和playsound库将文本... 目录什么是 gTTS 和 playsound安装依赖库实现步骤 1. 导入库2. 定义文本和语言 3

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的

Pytorch微调BERT实现命名实体识别

《Pytorch微调BERT实现命名实体识别》命名实体识别(NER)是自然语言处理(NLP)中的一项关键任务,它涉及识别和分类文本中的关键实体,BERT是一种强大的语言表示模型,在各种NLP任务中显著... 目录环境准备加载预训练BERT模型准备数据集标记与对齐微调 BERT最后总结环境准备在继续之前,确

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot