NLP
AI基础
预测性建模
在给定数据的基础上提升预测模型的准确率,只关注模型的预测准确性
而统计学模型主要关注模型的可解释性
优化问题
指如何根据已有的数学模型求出最优解的过程
增强学习
如何在动态环境下做出正确的决定,游戏AI、推荐、排名
其他分类
- 结构化数据
- 非结构化数据:文本数据、语音数据、图像数据
AI集中在对非结构化数据的处理上,因为非结构化数据很难处理
项目流程
一般流程:调研方案 -> 数据标注与开发 -> 调优 -> 部署
判断是否要做一个 AI 项目:
- 技术成熟度
- 人工无法解决的问题,机器更不可能解决
- 论文中的技术能否复现,这项技术在第一梯队厂商的成熟度如何
- 初期通过小 Demo 验证
- 团队的资源与能力
- 项目部署问题:硬件、环境
- 交付时间够不够
- 需求的可控程度
- 技术导向还是销售导向意味着需求是否可控
- 客户的管理能力意味着需求的质量
- 团队的管理能力
- 项目的周期与成本
- 被低估
- 需求变更
- 其他问题
- 标注不可控
- 调优所需的成本
- 部署所需的成本
- 模型的算力成本
- 项目交付流程
- 是否有明确的目标
- 不要忽略额外投入
- 项目交付能力:交付流程、人员职责安排、时间规范、烂尾风险
调研
- 很多时候,学术结果难以复现。
- 很多方法在某些数据上可能会非常好用,但是在另一些数据上则会失效。
- 很多方法的成功取决于一些细节,而这些细节只有真正做过的人才会知道。
- 很多时候人们会过于关注方法的效果,而忽略了整体的运行实效。
- 在绝大多数的时候,人们都会低估整个项目的难度
数据标注
- 前期一定要制定充分的标注规则
- 数据的采集一定要具有代表性
- 非常不建议采用自动标注的方式
- 先训练一个初步模型,然后只让相关人员进行校对,可以保证标注效率并减少标注成本
算法开发
- 不要采用规则的方式进行开发:规则越加越多只会导致成本爆炸
- 初期就要引导客户使用和购买能够支持深度学习框架的硬件
- 算法开发的过程中,一定要有量化的指标并记录下来
- 开发的过程中,多分解问题
- 前端对接的时候一定要去引导何为“智能”
效果优化
- 初期要充分考虑到效果优化所需要的时间和成本
- 客户并不知道通过什么标准来评估一个系统的好坏
- 一定要从数据的角度出发进行优化
- 学会止损
- 除了准确性的优化,还要注重代码运算效率的优化
- 算法开发和效果优化常常是需要反复进行的工作
部署
- 如果客户的系统比较奇怪,或者难以满足一些要求,要提前让客户知晓这些风险。
- 即使再小的项目,强烈建议用微服务架构、Docker、k8s进行部署。
- 因为技术、环境等问题,不要把算法部署在本地,尽量采用云端部署
NLP基础
基础性研究:网络架构、优化理论、对抗训练、数据增强、半监督学习、域迁移、Meta Learning、Auto ML、多任务模型、集成学习、图网络、知识图谱、多模态学习、机器推理
NLP研究:
- 预训练语言模型
- 文本分类
- 序列标注:给词打标
- 关系提取
- Dependency Parsing
- Semantic Parsing
- Seq2Seq
- 文本生成:GPT
- 文本推荐
- 翻译
- 指代消解
深度学习框架
包括什么:
- 以 GPU 为基础的 Tensor 运算(矩阵运算)
- 构建网络后自动求解梯度的方法
- 模型训练体系,把数据从处理到优化再到评估
- 模型推断体系,模型的使用、部署
硬件
CPU
- 一般不用 CPU 训练深度学习模型。
- 很多 if…else 出现时,CPU 会比 GPU 快。
- 如果需要加速,可以通过 Cython 访问 C++,这在实际业务性应用时很有用。
- 对于大部分硬件(GPU,TPU,FPGA),CPU会负责数据的读写 -> 在进行训练时,有时为了加速需要选择更多核的机器(cache miss 导致的速度不匹配)
CPU
英伟达的:
- geforce系列
- Pxxx系列
特点:
- SIMT
注意事项:
- GPU 训练效率可以被 DeepSpeed 显著提升。
- 很少出现 GPU 多线程训练。
- GPU 训练有时可能会被一些其他因素影响,如CPU,GPU 之间沟通速度(多 GPU或多节点)。
- 传统来说,NLP 的训练一般来说不会耗尽 GPU的资源,但是深度迁移模型出现后,GPU 常常出现算力不足或显存资源不足的情况。
- GPU 可处理动态的网络。
- 显存污染问题
- 部署经常被内存与显存之间的带宽影响
- 部署时需要对参数做详细调整,最重要参数为 Batch Size
TPU
- 用于训练神经网络的 TPU 只能通过 GCP 获得
- TPU 本质上来说是矩阵/向量相乘的机器,构造远比 GPU 简单,所以:
- TPU 十分便宜
- TPU 很容易预测其表现
- TPU 很擅长基于 Transformer 架构的训练和预测
- TPU 不能处理动态网络
- 原生 Tensorflow 对 TPU 支持最好,PyTorch 目前通过 XLA 的引进也部分支持 TPU。
- TPU 的主要运算瓶颈在于 IO 支持。
- TPU V3 多线程的方式性价比最高
部署
难点:
- AI 项目整体结构复杂,模块繁多。
- AI 很多时候需要大量的算力,需要使用 GPU,TPU 或者 FPGA。
- 深度学习框架依赖十分复杂,配置环境困难
原则:
- 部署隔离、稳定
- 采用合适硬件,注意 CPU 选型和 GPU 选型
- 以 Profiler 为导向进行优化
- 推断服务应该用同一个框架和一个线程,TPU 除外
- 部署应该是在项目初期就考虑
推断框架:
- 读取模型,提供 HTTP 接口
- 调用不同的硬件资源
- 对推断过程做一定处理,其中最重要的是批处理
TF Serving
随机性
- 随机性的来源
- 数据的噪声:无法消除
- 函数的拟合:可提升
- 过拟合与欠拟合是对神经网络设计和训练很重要的一点
能否解决问题在很大程度上取决于数据是否有足够信息:需要引入更多的信息来预测 -> 增加更多的维度
神经网络
数学本质:复合函数,可以很方便地组合出很多复杂的函数
由于复合函数求导法则,所以大部分神经网络的训练过程可以自动化(反向梯度传递)
优化算法:
- SGD
- SGD with Momentum
- Adagrad
- Adam
由于求解过程的复杂性,这使得神经网络的求解并不一定会收敛到最优解,设计与优化算法需要考虑解决梯度消失跟梯度爆炸
基础构成
损失函数:来评价模型的预测值和真实值不一样的程度
$$ L_2(\hat{y},y) = (\hat{y} - y)^2\ L_1(\hat{y},y) = |\hat{y} - y| $$
激活函数:
Dropout:
Batch Normalization:
Embedding
- 编码文本特征
RNN
- 特征提取