576 lines
42 KiB
TeX
576 lines
42 KiB
TeX
\chapter{开放能力}
|
||
本章节将详细讲述每个模块模型实现方法以及用户自主训练、预测的方法。
|
||
\section{回归预测}
|
||
回归是一种通过建模和分析变量之间关系的的方法,其目的是通过模型来计算得出一个具体的值。\\
|
||
\indent 回归预测在很多的方面得到应用,例如:天气预测、机械寿命预测、商品价格预测、股价预测等都有广泛的应用。本平台的回归预测模块选取了海浪高度预测、波士顿房价预测、碳排放预测和股票价格预测等四个典型预测问题,并提供多种不同类型的建模方法,方便使用者充分利用本平台构建自己的模型。
|
||
\subsection{海浪高度预测}
|
||
\subsubsection{模型构建}
|
||
海浪高度预测属于简单的回归预测,其样本的结构如表\ref{ocean_wave_data}所示:
|
||
\begin{table}[htb]
|
||
\centering
|
||
\resizebox{\textwidth}{15mm}{
|
||
\begin{tabular}{|c|c|c|c|c|c|c|c|}
|
||
\hline\hline
|
||
\textbf{列名} & \textbf{WVHT\_1} & \textbf{WDIR\_1} & \textbf{WSPD\_1} & \textbf{WDIR\_2} &\textbf{WSPD\_2} & \textbf{WDIR} & \textbf{WSPD} \\
|
||
\hline
|
||
\textbf{含义}&\textbf{t-1时刻高度}&\textbf{t-1时刻风向}&\textbf{t-1时刻风速}&
|
||
\textbf{t-2时刻风向}&\textbf{t-2时刻风速}&\textbf{当前风向}&\textbf{当前风速} \\
|
||
\hline
|
||
\textbf{数据类型}&\textbf{float}&\textbf{float}&\textbf{float}&\textbf{float}&\textbf{float}&\textbf{float}&\textbf{float}\\
|
||
\hline\hline
|
||
\end{tabular}}
|
||
\caption{海浪高度预测模型的数据特征及说明}
|
||
\label{ocean_wave_data}
|
||
\end{table}
|
||
因此,建模时采用简单的多层感知机(Multi-Layer Perceptron, MLP)即可快速完成任务,模型构造如图\ref{MLP}所示,输入数据通过z-score(式\ref{z_score})进行归一化,然后输入到感知机中,最后输出得到预测值,并与真实值进行比较,计算损失值进行迭代。
|
||
\begin{equation}
|
||
z(x) = \frac{x-\mu}{\sigma}
|
||
\label{z_score}
|
||
\end{equation}
|
||
\begin{figure}[htb]
|
||
\centering
|
||
\includegraphics[width=0.75\textwidth]{images/ch03/regression/MLP.png}
|
||
\caption{支持用户自定义的多层感知机}
|
||
\label{MLP}
|
||
\end{figure}
|
||
\indent 用户可以将自己的数据输入进模型,根据自定义的超参数进行训练,得到符合自己数据的专有模型;也可以直接输入特征数据进行预测。
|
||
\subsubsection{模型训练}
|
||
训练界面如图\ref{oceantrain}所示,该模型支持自定义神经元数量、学习率、训练轮数、激活函数、损失函数等超参数。
|
||
\begin{figure}[!htb]
|
||
\centering
|
||
\includegraphics[width=0.6\textwidth]{images/ch03/regression/oceanwave_train.png}
|
||
\caption{海浪高度模型训练界面}
|
||
\label{oceantrain}
|
||
\end{figure}
|
||
用户通过输入上述超参数,可以选择上传本地数据进行训练,若不上传,则默认使用线上数据。等待训练完成后,系统将返回该模型在验证集数据上的指标,如图\ref{ocean_train_result}所示。此时,用户就得到了一个基于自设超参数和本地数据的模型。
|
||
\begin{figure}[htb]
|
||
\centering
|
||
\includegraphics[width=0.8\textwidth]{images/ch03/regression/ocean_train_result.png}
|
||
\caption{海浪高度模型训练指标}
|
||
\label{ocean_train_result}
|
||
\end{figure}
|
||
\subsubsection{模型预测}
|
||
平台支持使用用户自定义和模型进行预测和使用平台预先训练好的模型进行训练,以用户自训练模型预测(图\ref{ocean_prediction})为例
|
||
\begin{figure}[htb]
|
||
\centering
|
||
\includegraphics[width=0.55\textwidth]{images/ch03/regression/ocean_prediction.png}
|
||
\caption{使用自训练模型预测}
|
||
\label{ocean_prediction}
|
||
\end{figure}
|
||
用户输入一条特征数据,点击\textbf{预测浪高}按钮,等待模型预测完成后,即可获得海浪高度的预测值。
|
||
\newpage
|
||
\subsection{波士顿房价预测}
|
||
波士顿房价预测属于经典的机器学习回归问题之一,该任务需要对79个与房价有关的特征进行处理和建模,最终得到能够预测房价的回归模型。该任务的评价指标是均方根误差(Root Mean Square Error, RMSE)\cite{kaggle}
|
||
\begin{equation}
|
||
RMSE(y) = \sqrt{\sum_{i=1}^{n}(y_i-\hat{y_i})^2}
|
||
\label{rmse}
|
||
\end{equation}
|
||
\subsubsection{模型构建}
|
||
由于特征维度较多,而且有很多的缺失值、部分特征存在异常值,因此首先进行特征分析和数据预处理。包括异常点检测、缺失值处理和数据填充、特征独热编码等。
|
||
\begin{enumerate}
|
||
\item \textbf{异常点检测}。异常点的分析以特征"GrLivArea"为例,打印其与房屋售价"SalePrice"的分布如图\ref{annopoint}所示,
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[width=0.75\textwidth]{images/ch03/regression/annopoint.png}
|
||
\caption{GrLivArea与SalePrice分布图}
|
||
\label{annopoint}
|
||
\end{figure}
|
||
清晰可见右上角有两个离群点,在训练时,可以考虑将这两条样本删除。同理,其他特征上包含异常值的样本,在数据预处理阶段也同时予以删除。
|
||
\item \textbf{缺失值处理}。对训练数据的缺失值进行分析,得到较高缺失比例的特征如图\ref{miss_rate}所示,高缺失率的特征将影响模型的泛化能力,因此将缺失率>30\%的特征(PoolQC, MiscFeature, Alley, Fence, FireplaceQu)删去,不参与后续训练。
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[width=0.5\textwidth]{images/ch03/regression/boston_miss_rate.png}
|
||
\caption{特征缺失比例}
|
||
\label{miss_rate}
|
||
\end{figure}
|
||
\item \textbf{缺失值填充}。对于剩余包含较少缺失值的特征列,分别采取填充None值、填充众数、填充平均数等方式,将缺失的部分填充上。
|
||
\item \textbf{正态性分析}。对于目标值SalePrice,构建其直方图和正态概率分布图\ref{non_normal_house_price},可见其呈明显正偏态分布,不利于回归建模。
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[scale=0.4]{images/ch03/regression/non_normal_dist.png}
|
||
\includegraphics[scale=0.4]{images/ch03/regression/non_normal_prob.png}
|
||
\caption{SalePrice的直方图和正态概率分布图}
|
||
\label{non_normal_house_price}
|
||
\end{figure}
|
||
因此,对价格列进行对数化处理,处理后的数据分布如图\ref{normal_house_price},可见其基本符合正态分布。
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[scale=0.4]{images/ch03/regression/normal_dist.png}
|
||
\includegraphics[scale=0.4]{images/ch03/regression/normal_prob.png}
|
||
\caption{对数化后SalePrice的直方图和正态概率分布图}
|
||
\label{normal_house_price}
|
||
\end{figure}
|
||
\item \textbf{特征独热编码} 对于离散型的特征,需要将其进行独热编码(one-hot),才能转变为机器可以识别的特征。
|
||
\end{enumerate}
|
||
经过数据预处理后,平台采用xgboost模型\cite{chen2016xgboost}进行回归建模。xgboost(eXtreme Gradient Boosting)是一种基于GBDT的算法,具有高效、灵活和轻便的特点,在数据挖掘、推荐系统等领域得到广泛的应用。通过预设的超参数集合,将训练样本输入xgboost模型中,经过数轮迭代后得到训练好的模型。
|
||
\subsubsection{模型训练}
|
||
平台提供了用户上传数据和自定义超参数训练模型的功能。用户可定义的超参数如表\ref{hyperparams_xgb}所示
|
||
\begin{table}[htb]
|
||
\centering
|
||
\begin{tabular}{|c|c|c|}
|
||
\hline\hline
|
||
\textbf{名称} & \textbf{含义} & \textbf{默认值} \\
|
||
\hline
|
||
\textbf{eta}&\textbf{学习率}&\textbf{0.05} \\
|
||
\hline
|
||
\textbf{max\_depth}&\textbf{树的最大深度}&\textbf{10}\\
|
||
\hline
|
||
\textbf{subsample}&\textbf{随机采样比例}&\textbf{0.7}\\
|
||
\hline
|
||
\textbf{colsample\_bytree}&\textbf{随机采样列数}&\textbf{0.8}\\
|
||
\hline
|
||
\textbf{num\_boost\_round}&\textbf{迭代轮数}&\textbf{1000}\\
|
||
\hline
|
||
\textbf{early\_stopping\_rounds}&\textbf{提前终止训练}&\textbf{200}\\
|
||
\hline\hline
|
||
\end{tabular}
|
||
\caption{房价预测模型的参数及说明}
|
||
\label{hyperparams_xgb}
|
||
\end{table}
|
||
\subsubsection{模型预测}
|
||
用户可以选择使用自训练模型进行预测,也可以选择使用平台已经训练好的模型进行预测。预测时需要按照波士顿房价预测问题官方给出的数据集格式准备好自己的数据,并将数据在指定界面上传,平台将返回符合官方要求的数据格式的文件。
|
||
\subsection{碳排放预测}
|
||
使用人工智能技术预测碳排放水平成为碳核算的重要手段之一,平台基于机组信息特征数据对燃煤发电$CO_2$排放强度进行预测。
|
||
\subsubsection{模型构建}
|
||
平台仍然使用xgboost进行相关的建模和预测。
|
||
\subsubsection{模型训练}
|
||
首先对训练集和样本外数据特征缺失比例进行分析,得到表\ref{co2_miss_rate}
|
||
\begin{table}[H]
|
||
\centering
|
||
\begin{tabular}{|c|c|c|}
|
||
\hline
|
||
特征名称 & \textbf{训练集缺失比例 } & \textbf{样本外缺失比例} \\
|
||
\hline
|
||
地区 & 0.00\% & 0.00\% \\
|
||
\hline
|
||
机组容量 & 0.00\% & 0.09\% \\
|
||
\hline
|
||
投产时间 & 1.29\% & 0.52\% \\
|
||
\hline
|
||
机组类型 & 0.00\% & 55.40\% \\
|
||
\hline
|
||
机组参数 & 0.00\% & 55.99\% \\
|
||
\hline
|
||
冷却方式 & 0.00\% & 55.78\% \\
|
||
\hline
|
||
煤种 & 0.00\% & 90.82\% \\
|
||
\hline
|
||
\end{tabular}
|
||
\label{co2_miss_rate}
|
||
\end{table}
|
||
由此可知,煤种作为特征,在样本外数据的覆盖度较差,为了提高模型的泛化能力,实际训练时不采用该维度的特征。
|
||
\subsubsection{模型预测}
|
||
用户输入\textbf{地区}、\textbf{机组容量}、\textbf{投产时间}、\textbf{机组类型}、\textbf{机组参数}、\textbf{冷却方式}几个变量,模型预测后得出$CO_2$的排放强度。
|
||
\subsection{股票预测}
|
||
股票预测是机器学习在量化投资方向的重要应用之一,在机器学习引入量化领域的早期,由于算力受限,通常使用的是较为简单的模型,例如基于统计学的预测、logistics回归等,随着相关技术的发展,基于深度神经网络、强化学习的方法逐渐产生。
|
||
\subsubsection{模型构建}
|
||
我们将股票预测抽象为简单的时间序列预测,以股票预测为基础,给出时间序列预测的具有普适性的建模方法。平台集成了Facebook的开源时间序列框架Prophet\cite{Taylor2018Forecasting}。Prophet将时间序列拆解为包含趋势、周期性和节假日的广义加性模型(Generalized Additive Model),即
|
||
\begin{equation}
|
||
y(t) = g(t) + s(t) + h(t) + \epsilon(t)
|
||
\label{gam}
|
||
\end{equation}
|
||
其中$g(t)$是趋势模型,$s(t)$是周期性模型,$h(t)$表示节假日带来的影响,$\epsilon(t)$表示一些噪声。Prophet通过训练数据得到加性模型。
|
||
\subsubsection{模型训练}
|
||
由式\ref{gam}可知,模型仅依靠纯时间序列即可完成训练。用户需要提交包含时间和预测值两列的csv文件,并且将两列命名为\code{ds}和\code{y},其中ds列需要处理为时间格式。模型接收数据后即可完成训练。
|
||
\subsubsection{模型预测}
|
||
通过输入\textbf{预测时长}和\textbf{预测频率},即可获得模型针对训练数据,对未来一定时长内,按照一定频率的预测值。
|
||
\section{智能图像}
|
||
机器视觉(Machine Vision)是人工智能领域中发展迅速的一个重要分支,目前正处于不断突破、走向成熟的阶段。智能图像处理是指一类基于计算机的自适应于各种应用场合的图像处理和分析技术,本身是一个独立的理论和技术领域,但同时又是机器视觉中的一项十分重要的技术支撑。\\
|
||
\indent 智能图像处理的主要技术包括图像预处理、图像分割、目标识别和分类、目标检测和跟踪等主要研究方向。近年来,随着深度学习技术的不断发展,利用深度神经网络完成相关任务成为智能图像处理领域的主流方法。\\
|
||
\indent 在本模块中,平台基于深度神经网络技术,实现了综合性的图像智能处理功能。包括基础问题建模(MNIST手写体分类、图片文字识别),智能目标检测、智能图像分割、人体关键点检测、智能图像生成(通过文字描述生成图像)等应用,可以快速根据需求生成所需的结果。
|
||
\subsection{MNIST手写体分类}
|
||
MNIST手写体数据集来自美国国家标准与技术研究所(National Institute of Standards and Technology, NIST). 训练集有60000个样本,测试集有10000个样本。样本经过归一化后,每张图片的大小是相同的。该数据集由Yann LeCun等人维护。图\ref{MNIST_sample}展示了部分样本转换为图片后的样式。
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[width=0.2\textwidth]{images/ch03/vision/1.jpg}
|
||
\includegraphics[width=0.2\textwidth]{images/ch03/vision/2.jpg}
|
||
\includegraphics[width=0.2\textwidth]{images/ch03/vision/7.jpg}
|
||
\caption{MNIST数据集示例}
|
||
\label{MNIST_sample}
|
||
\end{figure}
|
||
\subsubsection{模型构建}
|
||
由于任务相对简单,我们以经典的LeNet-5来完成MNIST手写体识别任务。LeNet-5网络结构如图\ref{LeNet}所示
|
||
\begin{figure}[htb]
|
||
\centering
|
||
\includegraphics[width=0.8\textwidth]{images/ch03/vision/LeNet-5.png}
|
||
\caption{LeNet-5网络结构\cite{lecun1995convolutional}}
|
||
\label{LeNet}
|
||
\end{figure}
|
||
\subsubsection{模型训练}
|
||
用户可以上传数据并自设学习率和迭代轮数进行模型自训练。
|
||
\subsubsection{模型预测}
|
||
用户可以使用自训练的模型进行预测,也可以上传数据,使用平台预先训练好的模型进行预测。预测界面如图\ref{mnist_pred}所示
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[width=0.9\textwidth]{images/ch03/vision/mnist_predict.png}
|
||
\caption{MNIST预测界面}
|
||
\label{mnist_pred}
|
||
\end{figure}
|
||
\subsection{图片文字识别}
|
||
光学字符识别(Optical Character Recognition, OCR)是指对文本资料的图像文件进行分析识别处理,获取文字及版面信息的过程。亦即将图像中的文字进行识别,并以文本的形式返回。
|
||
\subsubsection{模型构建}
|
||
平台集成了开源离线OCR工具tr\cite{myhub2021tr},用户只需要上传图片,就可以得到图片中的文字。
|
||
\subsubsection{模型训练}
|
||
暂不支持自训练。
|
||
\subsubsection{模型预测}
|
||
用户上传带有文字的图片,平台经过计算后,返回图片中的文字,效果如图\ref{ocr_pred}所示
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[width=0.9\textwidth]{images/ch03/vision/ocr_result.png}
|
||
\caption{OCR识别效果}
|
||
\label{ocr_pred}
|
||
\end{figure}
|
||
\subsection{目标检测}
|
||
YOLO(You Only Look Once)\cite{Redmon2015YOLO}系列算法采用单个神经网络直接预测物品边界和类别概率,实现端到端的物品检测。该方法的特点是将目标检测任务看作目标区域预测和类别预测的回归问题,实现快速检测的同时还达到较高的准确率。平台采用相对更轻量级且推理速度更快的YOLOv5框架\cite{glenn_jocher_2022_7002879}作为目标检测模型的基础框架。
|
||
\subsubsection{模型构建}
|
||
YOLOv5的网络结构如图\ref{yolov5}所示,
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[width=0.9\textwidth]{images/ch03/vision/yolov5.png}
|
||
\caption{YOLOv5网络结构图}
|
||
\label{yolov5}
|
||
\end{figure}
|
||
由于模型代码已经开源,平台直接利用了其开源代码搭建模型。
|
||
\subsubsection{模型训练}
|
||
通过YOLOv5的开源代码,我们可以利用预训练好的代码和权重进行训练。通过以下指令,就完成了基于yolov5n的网络结构和COCO数据集,BATCH大小为128的模型的训练。
|
||
\begin{Verbatim}[H]
|
||
python train.py --data coco.yaml --cfg yolov5n.yaml --weights '' --batch-size 128
|
||
\end{Verbatim}
|
||
该模型训练耗时和算力消耗都比较大,因此平台不提供自主数据训练。
|
||
\subsubsection{模型预测}
|
||
平台支持使用不同参数量的YOLOv5模型进行预测,用户通过上传本地的图片,选择YOLOv5模型的版本,进行目标检测模型的预测。具体版本类型如表\ref{yolov5_version}所示:
|
||
\begin{table}[H]
|
||
\centering
|
||
\begin{tabular}{|c|c|c|c|c|}
|
||
\hline\hline
|
||
\textbf{Model} & \textbf{size(pixels)} & \textbf{Speed(ms)}&\textbf{params(M)} & \textbf{FLOPs@640 (B)} \\
|
||
\hline
|
||
\textbf{YOLOv5n}&640&45&1.9&4.5 \\
|
||
\hline
|
||
\textbf{YOLOv5s}&640&98&7.2&16.5 \\
|
||
\hline
|
||
\textbf{YOLOv5m}&640&224&21.2&49.0 \\
|
||
\hline
|
||
\textbf{YOLOv5l}&640&430&46.5&109.1 \\
|
||
\hline
|
||
\textbf{YOLOv5x}&640&766&86.7&205.7\\
|
||
\hline\hline
|
||
\end{tabular}
|
||
\caption{YOLOv5可选版本及其部分参数}
|
||
\label{yolov5_version}
|
||
\end{table}
|
||
\indent 使用YOLOv5x对图片进行分割的结果如图\ref{yolov5x_rst}所示
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[width=0.45\textwidth]{images/ch03/vision/yolov5x_in.jpg}
|
||
\hspace{3mm}
|
||
\includegraphics[width=0.45\textwidth]{images/ch03/vision/yolov5x_out.jpg}
|
||
\caption{YOLOv5x检测结果}
|
||
\label{yolov5x_rst}
|
||
\end{figure}
|
||
\subsection{智能图像分割}
|
||
图像分割技术是目前计算机视觉领域最热门的技术之一,许多应用了计算机视觉的场景都需要对图像进行智能分割,以充分理解图像中的内容,以便于机器分析图像中各个部分之间的关系。图像分割技术主要分为语义分割和实例分割等。\\
|
||
\indent 光伏发电站,是指一种特殊材料电子元件(诸如晶硅板、逆变器等)组成的利用太阳能发电的体系,与电网相连并向电网输送电力。利用遥感图像和图像分割技术,可以对光伏发电站的空间分布进行精准确定。因此,本平台以光伏发电站的遥感图像为例,提供了光伏板智能图像分割服务。
|
||
\subsubsection{模型构建}
|
||
U-Net是一种U型的类Encoder-Decoder卷积神经网络,最初被应用于医疗图像分割,后来实验证明其在其他领域的图像分割也有较好的效果,是实现语义分割或实例分割的较为基础的模型,其网络结构如图\ref{unet}所示:
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[scale=0.53]{images/ch03/vision/unet.png}
|
||
\caption{U-Net的网络结构图\cite{2020UNet}}
|
||
\label{unet}
|
||
\end{figure}
|
||
\indent 模型首先通过卷积操作进行特征融合,通过池化层进行降维,然后再通过卷积层进行上采样,最后通过$1\times 1$的卷积进行结果的输出。
|
||
\subsubsection{模型训练}
|
||
\begin{enumerate}
|
||
\item \textbf{数据准备}。 U-Net模型训练需要同时准备原图像和标注图像,平台使用了zenodo上的开源遥感光伏数据集\cite{jiang_hou_2021_5171712}来建模,其示例如图\ref{unet-data}所示,标注图像需标注出光伏板的位置
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[scale=0.4]{images/ch03/vision/unet-ori.jpg}
|
||
\hspace{5mm}
|
||
\includegraphics[scale=0.43]{images/ch03/vision/unet-label.jpg}
|
||
\caption{U-Net数据集示例}
|
||
\label{unet-data}
|
||
\end{figure}
|
||
\item \textbf{模型训练}。首先将原始图像进行数据增强,例如随机限制对比度、随机增加白噪声、随机锐化和模糊等,然后调整分表了使得图像像素长宽能被32整除,最后将图像规范化成为神经网络模型可接受的输入。训练时以DiceLoss作为损失函数,使用交并比作为训练时更新模型的指标。
|
||
\end{enumerate}
|
||
\subsubsection{模型预测}
|
||
模型预测支持单张图片预测,也支持批量预测,用户通过平台上传本地图片,模型运行完成后会返回分割后的结果。最终分割的效果如图\ref{unet-out}所示
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[scale=0.33]{images/ch03/vision/unet_photovoltaic.png}
|
||
\caption{U-Net分割光伏图像}
|
||
\label{unet-out}
|
||
\end{figure}
|
||
\subsection{人体关键点检测}
|
||
人体关键点检测,Human Pose Estimation,指通过识别一些人体关键点,如头部、肩膀、关节等,描述人体骨骼信息。人体关键点检测是计算机视觉的重要应用之一,以人体关键点检测为基础,可以进行行为识别、人物跟踪、步态识别等相关研究。按照检测目标的维度,人体关键点检测一般可以分为二维关键点检测和三维关键点检测。
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[scale=0.6]{images/ch03/vision/pose_esti.jpg}
|
||
\caption{二维人体关键点检测\cite{aliyun2018pose}}
|
||
\label{pose_esti}
|
||
\end{figure}
|
||
\subsubsection{模型构建}
|
||
MMPose是一个基于PyTorch的开源姿态估计工具箱。基于MMPose的开源框架,我们可以简单的搭建一个人体关键点检测的建模、训练和预测服务。
|
||
\subsubsection{模型训练}
|
||
平台选择了MMPose自带的预训练模型搭建服务,MMPose框架也支持使用者基于自有数据进行模型微调或者重新训练,指令如下
|
||
\begin{Verbatim}[H]
|
||
python tools/train.py ${CONFIG_FILE}$ [optional arguments]
|
||
\end{Verbatim}
|
||
\subsubsection{模型预测}
|
||
用户可以直接上传本地图片进行预测,模型预测的效果如图\ref{pose_out}所示
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[width=0.4\textwidth]{images/ch03/vision/pose_in.jpg}
|
||
\hspace{5mm}
|
||
\includegraphics[width=0.4\textwidth]{images/ch03/vision/pose_out.jpg}
|
||
\caption{预测结果示例}
|
||
\label{pose_out}
|
||
\end{figure}
|
||
\subsection{图像生成}
|
||
根据文本生成对应的图像是多模态任务之一。解决这一问题的主流方法有VAE(Variational Auto-Encoder),DRAW(Deep Recurrent Attention Writer)以及生成对抗网络(Generative Adversarial Networks, GAN)等。
|
||
\subsubsection{模型构建}
|
||
FuseDream是一个结合CLIP(Connecting Text and Images)和GAN的开源文本生成图像模型
|
||
\begin{enumerate}
|
||
\item \textbf{生成对抗网络模块}。GAN模块的结构如下图\ref{gan}所示
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[width=0.8\textwidth]{images/ch03/vision/GAN.jpg}
|
||
\caption{生成对抗网络结构图}
|
||
\label{gan}
|
||
\end{figure}
|
||
生成对抗网络模型由两部分组成,一个是生成模型(Generator),一个是判别模型(Discriminator Network)。生成模型的任务是尽力模仿输入的数据生成类似的数据。判别模型的任务是判断给定的实例是否是由生成器伪造的。
|
||
\item \textbf{CLIP模块}。CLIP的英文全称是Contrastive Language-Image Pre-training,即一种基于对比学习的文本-图像对的预训练模型。如下图\ref{clip}所示,CLIP包括两个模型:Text Encoder和Image Encoder,其中Text Encoder用来提取文本的特征,可以采用transformer模型;而Image Encoder用来提取图像的特征,可采用CNN模型。
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[width=0.6\textwidth]{images/ch03/vision/CLIP.jpg}
|
||
\caption{CLIP结构图\cite{radford2021learning}}
|
||
\label{clip}
|
||
\end{figure}
|
||
\end{enumerate}
|
||
\subsubsection{模型训练}
|
||
训练时按照如下步骤进行
|
||
\begin{enumerate}
|
||
\item 通过对数据集随机扰动,进行数据增强。
|
||
\item 使用CLIP模型计算文本与图像的相似度,依靠增强的数据,增加CLIP的鲁棒性。
|
||
\item 将CLIP模型计算得分较高的一部分数据送入GAN模型,进行训练。
|
||
该模型利用了预训练的BIG-GAN权重,在使用时无需重复训练,根据用户输入的文本进行微调即可。
|
||
\end{enumerate}
|
||
\subsubsection{模型预测}
|
||
用户输入文字,模型经过生成后,输出对应的图片。示例如下
|
||
\begin{figure}[H]
|
||
\centering
|
||
\subfigure[A photo of a blue dog.]{\includegraphics[width=0.3\textwidth]{images/ch03/vision/blue_dog.png}}
|
||
\hfill
|
||
\subfigure[Sun rises from sea.]{\includegraphics[width=0.3\textwidth]{images/ch03/vision/sunrise.png}}
|
||
\hfill
|
||
\subfigure[A small flower blooms on the cliff.]{\includegraphics[width=0.3\textwidth]{images/ch03/vision/flower_blooms.png}}
|
||
\caption{生成图像示例}
|
||
\label{text2gan}
|
||
\end{figure}
|
||
\section{自然语言处理}
|
||
自然语言处理(Natural Language Processing, NLP)是计算机科学与人工智能领域中的一个重要研究方向。它是关于如何使计算机理解人所使用的自然语言的研究,是融合计算机科学、语言学、数学等学科于一体的科学。
|
||
自然语言处理任务通常包括句法分析、文本分类、机器翻译、阅读理解、人机对话等多种任务,在舆情分析、智能机器人等研究上扮演了重要的角色。平台以将这些任务为例,结合最新预训练模型技术进行建模。
|
||
\subsection{文本情感分类}
|
||
文本分类任务是NLP任务中较为基础的应用。文本情感分类一般是指按照文本内容,将文本情感分为两类(积极、消极)或三类(积极、中性、消极)。\\
|
||
\indent 传统文本情感分类任务一般是基于中文分词、词向量结合TextCNN等神经网络模型实现的,近年来,随着各种Transformer预训练模型的出现,基于预训练模型进行微调(Fine-Tune)的文本分类模型逐渐成为主流。本平台的文本分类模型即采用了这种方式。
|
||
\subsubsection{模型构建}
|
||
使用Bert等Transformer模型进行微调预测的网络结构如下图\ref{bert_cls}所示,中文文本一般不再需要分词,而是经过在词表中的位置映射,转换为机器能够理解的编码。对于文本分类任务,BERT模型在文本前插入一个[CLS]符号,经过训练和,该符号可以学习到整段文本的语义表示,并将该符号对应的向量输出得到最后的分类结果。
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[scale=0.6]{images/ch03/nlp/bert_classify.png}
|
||
\caption{Bert文本分类\cite{devlin2018bert}}
|
||
\label{bert_cls}
|
||
\end{figure}
|
||
构建模型时,采用 RoBERTa 作为基础的预训练模型,相比于Bert,RoBERTa基于更大的训练数据和更长的预训练时间进行预训练。
|
||
\subsubsection{模型训练}
|
||
平台支持文本分类任务的自主训练,用户同时上传训练数据集和测试数据集,平台建模完成后,会提供预测的结果文件,可供用户下载。
|
||
\subsubsection{模型预测}
|
||
用户也可以只提交测试文件,平台基于线上模型进行预测,同时返回预测结果。
|
||
\subsection{机器翻译}
|
||
机器翻译(Machine Translation),是利用计算机把一种自然语言翻译为另一种自然语言的过程。早期的机器翻译一般是利用规则或者统计模型,基于规则或统计学模型进行翻译。近年来,随着深度神经网络和编码器-解码器(Encoder-Decoder)模型的发展,使用这类模型完成机器翻译任务逐渐成为主流方式。
|
||
\subsubsection{模型构建}
|
||
平台采用了基于编码器-解码器和注意力机制的Transformer模型来训练英译中模型。结构如图\ref{attention}所示:
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[scale=0.25]{images/ch03/nlp/attention.png}
|
||
\caption{注意力机制的Endcoer-Decoder模型\cite{2017Attention}}
|
||
\label{attention}
|
||
\end{figure}
|
||
各部分的构成如下:
|
||
\begin{enumerate}
|
||
\item {编码器Encoder}。首先通过字向量与位置编码将原文映射,然后多次重复x个encoder块,每个encoder块包括注意力机制(Attention)层、层归一化(Layer Normalization, LN)和前馈神经网络(FFN)层。
|
||
\item {解码器Decoder}。解码器将译文作为输入,同时接收编码器的输出,经过Attention层、FFN层和层归一化后,得到对应位置每个词的输出概率。
|
||
\end{enumerate}
|
||
\subsubsection{模型训练}
|
||
平台支持用户自训练模型,用户可以自己准备训练语料,将分词后的原文、译文按照“原文+ Tab + 译文”的格式上传(原文、译文可以选择任意语种)。
|
||
\subsubsection{模型预测}
|
||
用户可以使用自主训练的模型,输入文本进行翻译,也可以基于平台的预训练中译英模型,输入中文来获得对应的英文。
|
||
\subsection{阅读理解}
|
||
机器阅读(Machine Reading Comprehension)是一种让机器像人一样有阅读理解能力的任务,区别于基于检索式的文本问答,更侧重与对文本细致化语言的理解与推理能力,其问题的一般表现形式有以下几种:
|
||
\begin{enumerate}
|
||
\item 区间答案型。即答案完全出现在文章中,需要模型识别出文章中正确答案的起止位置。
|
||
\item 多项选择型。即模型需要从若干个选项中选出正确答案。
|
||
\item 完形填空型。即在原文中去处若干处,让模型生成对应位置的词语。
|
||
\item 自由回答型。即让模型自由生成答案。
|
||
\end{enumerate}
|
||
此外,一些数据集中也设计了“无法回答”的问题,即给出的文本中难以获得合适的答案,需要模型输出空或者没有答案(unanswerable)。我们针对第一种问题进行了建模。
|
||
\subsubsection{模型构建}
|
||
对于此类问题,无论是基于[CLS]输出答案位置坐标进行训练,还是基于Seq2Seq的方式生成答案,均可以完成阅读理解任务。不过相较于前者,后者更符合人的阅读习惯。因此我们采用了基于语言模型(Masked Model Language, MLM),以非自回归的方式训练了阅读理解模型。相较于自回归的Seq2Seq形式,提高了解码速度。\\
|
||
\indent 给定最大答案长度$l_{max}$,将文章与问题用[SEP]字符拼接起来,再拼接$l_{max}$个[Mask]字符,最后用Mask字符与正确答案进行训练,用MASK位置的编码进行解码得到答案即可。模型结构如下图\ref{MRC}所示:
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[scale=0.35]{images/ch03/nlp/MLM_MRC.png}
|
||
\caption{注意力机制的Endcoer-Decoder模型\cite{kexuefm-7148}}
|
||
\label{MRC}
|
||
\end{figure}
|
||
\subsubsection{模型训练}
|
||
基于开源数据集WebQA\cite{Li2016Dataset}和SogouQA\cite{cips2018sogou}进行训练。两个数据集均给出了围绕一个问题的多段文本,以及这个问题的答案。经过去除无效答案后,按照\ref{MRC}进行建模训练。
|
||
\subsubsection{模型预测}
|
||
用户需要输入问题和围绕问题的一段或数段描述,模型将根据问题和描述返回答案,例如:
|
||
\begin{Verbatim}[H]
|
||
问题:嬴政在哪里出生?
|
||
描述1:"嬴政出生于赵国都城邯郸,后回到秦国,公元前247年继承王位,时年十三岁。",
|
||
描述2:"嬴政建立起一个中央集权的统一的多民族国家——秦朝",
|
||
描述3:"公元前221年,秦国统一六国。",
|
||
答案:邯郸
|
||
\end{Verbatim}
|
||
\subsection{语义匹配}
|
||
语义匹配是NLP领域的基础任务之一,直接目标就是判断两句话是否表达了相同或相似意思。语义匹配可应用于推荐系统、智能问答、搜索引擎、文本查重等。传统的文本匹配技术有词袋模型(Bag of Words)、TF-IDF、Jaccard矩阵、SimHash等算法,主要基于词的层级进行匹配,近年来,结合预训练模型的深度神经网络模型逐渐成为这一领域的主流模型。
|
||
\subsubsection{模型构建}
|
||
我们利用Bert的[SEP]字符的特性,可以将两句话拼接在一起,然后基于[CLS]字符来表示两句话是否具有相近语义,构造一个简单的二分类任务,网络框架如下图\ref{simi}所示
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[scale=0.35]{images/ch03/nlp/simi_match.png}
|
||
\caption{注意力机制的Endcoer-Decoder模型}
|
||
\label{simi}
|
||
\end{figure}
|
||
\subsubsection{模型训练}
|
||
训练用数据集每行由两列文本和一列标记组成,标记用1/0来表示相似/不相似。经过tokenizer后变为上图中bert的输入。损失函数选择cross\_entropy,优化器选择Adam进行训练。
|
||
\subsubsection{模型预测}
|
||
用户在页面输入待预测的两段文本,模型最后返回其预测结果。
|
||
\subsection{文本生成}
|
||
文本生成是基于给出的信息,生成近似于自然语言的文本序列。根据应用场景,自然语言处理下的文本生成任务又可以用于机器翻译、对话系统、故事、诗歌生成、摘要生成等。近年来,随着多模态应用的兴起,根据图片、视频生成文本方面也出现了很多优秀的模型。本平台提供的文本生成服务是基于语言模型(Language Model)和随机采样的文章续写。
|
||
\subsubsection{模型构建}
|
||
基于单向语言模型,以自回归的方式进行解码的方式进行建模。单向语言模型结构如下图\ref{lm}所示,即在预测t时刻的字符时,只能依赖t时刻以前已知的字符进行推理。而自回归解码器将解码器自己当前步的输出加入下一步的输入,通过这种方式,可以逐步推导接下来最可能生成的文字,直至推导出结束符\code{<EOS>}或达到最大长度。
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[scale=0.35]{images/ch03/nlp/lm.png}
|
||
\caption{单向语言模型}
|
||
\label{lm}
|
||
\end{figure}
|
||
\subsubsection{模型训练}
|
||
按照建模思路,平台使用NEZHA\cite{Wei2019NEZHA}的预训练权重作为语言模型。由于文章续写只依赖于文字本身,因此不需要使用segment\_id来区分更多细节。
|
||
\subsubsection{模型预测}
|
||
模型解码时,按照自回归的方式逐步解码,并依据概率,在解码空间内随机采样,逐步生成后续的文本。用户使用时,只需要输入一段文本作为开头,模型会自动进行续写。
|
||
\subsection{对话系统}
|
||
智能对话系统按照需求类型一般分为任务导向型(task-oriented)对话系统和非任务导向型(non-task-oriented)对话系统。任务型对话系统是基于一定的任务目标,通过预设流程或者插槽填充(slot filling)的方式引导对话完成;非任务导向性对话系统一般是以闲聊为目的,利用Encoder-Decoder模型,基于大量聊天对话语料进行训练,基于当前对话以及上文内容,自动生成回复内容。
|
||
\subsubsection{模型构建}
|
||
我们选择非任务导向性对话系统作为平台的智能对话系统,相对于一般的文本生成任务,对话任务有两个难点,一是需要对说话人的身份予以区分,二是生成的文本需要符合上文的语境和连贯性。利用基于预训练模型的Transformer结构进行微调,其网络结构如下图\ref{chatbot}所示
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[scale=0.45]{images/ch03/nlp/dialog.png}
|
||
\caption{闲聊机器人模型架构\cite{kexuefm-7718}}
|
||
\label{chatbot}
|
||
\end{figure}
|
||
模型的输入文本是历史的对话记录,将每句话用[SEP]符号分隔开,同时以不同的Segment Id作为说话人角色的区分,同时使用相对位置编码的NEZHA作为基础的预训练模型。与基于Bert的分类任务不同,基于Bert的生成任务,不再以[CLS]的输出作为结果,而是利用decoder进行解码,再通过集束搜索(Beam Search)或贪婪搜索(Greedy Search)等方式将输出结果映射到解码空间。
|
||
\subsubsection{模型训练}
|
||
平台基于LCCC数据集\cite{wang2020large}和GPT预训练模型进行训练。数据集给出一段段对话记录,每一段对话记录都可以通过拆解获得多条训练样本,每条样本包含一句或多句历史对话和一句目标文本,历史对话用于输入模型,目标文本用于验证模型的输出、计算损失并优化模型。
|
||
\subsubsection{模型预测}
|
||
模型支持两人之间的对话,用户通过将历史对话输入平台,平台运行模型得到最后的输出。
|
||
\subsection{句法分析}
|
||
句法分析的主要任务是识别出句子所包含的句法成分以及这些成分之间的关系,主要分为以下两个任务:
|
||
\begin{enumerate}
|
||
\item 成分句法分析(Constituency Parsing): 分析句子的成分,如名词、动词等,给出一棵由终结符和非终结符构成的句法树。
|
||
\item 依存句法分析(Dependency Parsing): 分析句子中词与词之间的依存关系,给一棵由词语依存关系构成的依存句法树。
|
||
\end{enumerate}
|
||
成分句法分析(constituent parsing)是自然语言处理中的一个基础任务,它的任务是给定一个句子,分析出句子的短语结构句法树。例如给定句子“The little boy likes red tomatoes .”,它的成分句法树如下图\ref{syntax_tree}所示:
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[scale=0.5]{images/ch03/nlp/syntactic_tree.png}
|
||
\caption{Syntactic tree\cite{liu2017order}}
|
||
\label{syntax_tree}
|
||
\end{figure}
|
||
依存句法分析则是为了分析句子中各个部分,即主、谓、宾、定、状、补,以及他们之间的依存关系,如主谓关系、动宾关系等。
|
||
\subsubsection{模型构建}
|
||
我们基于HanLP框架\cite{he-choi-2021-stem}构建了句法分析的服务,HanLP是面向生产环境的多语种自然语言处理工具包,支持PyTorch和Tensorflow框架。
|
||
\subsubsection{模型训练}
|
||
框架嵌套了基于预训练模型的算法,因此不需要外部数据的训练。
|
||
\subsubsection{模型预测}
|
||
用户输入待预测的句子,模型分析完成后返回词的成分以及词之间的依存关系,结果如图\ref{dependency_tree}所示
|
||
\begin{Verbatim}[H]
|
||
中心旨在紧密围绕山东省和国家需求,构建互联互通的泛能源大数据数据体系。
|
||
\end{Verbatim}
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[scale=0.25]{images/ch03/nlp/dependency_analysis.png}
|
||
\caption{依存句法树}
|
||
\label{dependency_tree}
|
||
\end{figure}
|
||
\section{智能语音}
|
||
早期的语音技术主要包括利用信号处理的相关知识,进行语音的去噪、波形分析等,随着人工智能技术的发展和计算机算力的提升,基于深度学习模型的智能语音技术蓬勃发展。广义的智能语音技术主要包括\textbf{矢量信号处理(Vector Signal Processing, VSP)}、\textbf{自动语音识别(Automatic Speech Recognition, ASR)}、\textbf{自然语言处理(Natural Language Processing, NLP)},以及\textbf{语音合成(Text to Speech, TTS)}。这几个模块构成了一个完整的\textbf{语音交互(Voice User Interface)}系统,其结构如下图\ref{vui}所示
|
||
\begin{figure}[H]
|
||
\centering
|
||
\includegraphics[scale=0.45]{images/ch03/audio/vui.jpg}
|
||
\caption{语音交互系统\cite{zhinengyuyindongcha2020}}
|
||
\label{vui}
|
||
\end{figure}
|
||
其中,语音识别和语音合成属于智能语音技术的核心部分。
|
||
\subsection{语音识别}
|
||
语音识别是将音频文件转为自然语言文字的技术,主要由特征提取、声学模型、语言模型构成。其衍生技术包括声纹识别、机器唤醒、情绪识别等。\\
|
||
\indent 语音识别最终是统计优化问题,给定输入序列$O=\{O_1,\dots,O_n\}$,寻找最可能的词序列$W=\{W_1,...,W_m\}$,即寻找使得概率$P(W|O)$最大的词序列。最开始的研究都是分别求取声学和语言模型。随着深度学习和大数据的端到端(End-to-End)方法发展起来,能将声学和语言模型融为一体,直接计算$P(W|O)$。
|
||
\subsubsection{模型构建}
|
||
构建语音识别模型主要步骤包以下步骤:
|
||
\begin{enumerate}
|
||
\item 特征提取。特征提取是将语音的波形信号转换为机器能识别的特征,主要方法包括梅尔频谱特征、FBank(Filter Bank)特征提取和梅尔倒谱系数(Mel-scaleFrequency Cepstral Coefficients, MFCC)特征提取
|
||
\item 建立数据集。语音选择的基本单位是帧(Frame),一帧数据是由一小段语音经过ASR前端的声学特征提取模块产生的,整段语音就可以整理为以帧为单位的向量组。每帧的维度固定不变,但跨度可调,以适应不同的文本单位,比如音素、字、词、句子。
|
||
\item 模型搭建。传统方式是音学模型和语言模型分别建模,即音学模型使用隐马尔科夫模型和高斯混合模型学习信号的动态和静态特征;语言模型基于音学模型的特征求解$P(W|O)$,常用的方法基于n元语法(n-gram Grammar)或RNN。端到端的方法可以使用连接时序分类,(Connectionist temporal classification, CTC)或者Attention的方法。
|
||
\end{enumerate}
|
||
\subsubsection{模型训练}
|
||
平台使用WeNet\cite{yao2021wenet}模型作为语音识别模型的训练和预测工具,其使用conformer网络结构和CTC/attention loss联合优化方法,具备统一的流式/非流式语音识别方案。训练过程如下:
|
||
\begin{enumerate}
|
||
\item \textbf{数据准备}。首先要按照如下形式准备wav.scp和text两个文件。\\
|
||
\begin{minipage}[t]{0.48\textwidth}
|
||
\begin{tabular}{|c|c|c|}
|
||
\hline
|
||
列名 & \textbf{wav\_id } & \textbf{wav\_path} \\
|
||
\hline
|
||
示例 & id001 & /path/to/id001.wav \\
|
||
\hline
|
||
\end{tabular}
|
||
\captionof{table}{wav.scp}
|
||
\end{minipage}
|
||
\begin{minipage}[t]{0.48\textwidth}
|
||
\begin{tabular}{|c|c|c|}
|
||
\hline
|
||
列名 & wav\_id & text\_label \\
|
||
\hline
|
||
示例 & id001 & text of id001.wav \\
|
||
\hline
|
||
\end{tabular}
|
||
\captionof{table}{text}
|
||
\label{wav_data}
|
||
\end{minipage}
|
||
\item \textbf{提取cmvn特征(可选)}。提取倒谱均值方差归一化(cepstral mean and variance normalization, CMVN)系数,用于对声学特征归一化。
|
||
\item \textbf{生成文本和token的对应词典}。由于计算机无法直接理解汉字,所以需要将音频中出现的汉字以及特殊字符如静默字符\code{<blank>},未知字符\code{<unk>},音频开始/结束字符\code{<sos/eos>}映射到数值上,一般用自增的整数来表示每个字符,这些整数称为token。
|
||
\item \textbf{构造WeNet可识别的数据格式}。wenet模型需要以json格式表示的表征音频和文本的统一数据格式,由 \code{key}, \code{value} 和 \code{txt} 三个键值对组成,示例如下:\\
|
||
\verb|{"key":"id001", "wav":"/path/to/001.wav", "txt":"本段音频的文本内容"}|
|
||
\item \textbf{模型训练}。使用\code{run.sh}中的脚本进行训练。
|
||
\end{enumerate}
|
||
\subsubsection{模型预测}
|
||
用户上传wav音频文件后,平台通过识别最后得到该段文本的文字,并将文本展示到界面上。
|
||
\subsection{语音生成}
|
||
智能语音合成(TTS)是把文字智能地转化为自然语音流的技术,即输入文本 ,输出机器可以解析的波形。近年来,个性化TTS、带有情绪的TTS等逐渐成为研究的热点。
|
||
\subsubsection{模型构建}
|
||
我们使用了基于Tacotron2的模型训练了TTS模型。Tacotron是Google Brain推出的端到端的开源TTS深度神经网络模型,Tacotron是一个带有Attention机制的序列到序列(Sequence-To-Sequence,Seq2Seq)生成模型。使用<文本序列,语音声谱>配对的方式进行训练。Tacotron2是Tacotron的改进版,使用了LSTM和卷积层代替了原来的CBHG模块,并且使用WaveNet的声码器代替了Griffin-Lim算法。
|
||
\subsubsection{模型训练}
|
||
Tacotron2原模型是针对英文语音合成的模型,要训练针对中文的模型,首先要对数据进行\textbf{拼音化处理},即:
|
||
\begin{enumerate}
|
||
\item 对于输入文本从左向右遍历,优先从词拼音库中以词的方式匹配读音,若没有匹配到词语,从字拼音库中获取该汉字的拼音;
|
||
\item 对于数字、ip地址等,首先根据规则转化成文字,再转化为拼音;
|
||
\item 由于输入是文字转化而来的拼音序列,所以在合成阶段,允许部分或全部的拼音输入。
|
||
\end{enumerate}
|
||
数据处理完成后,即可使用原有脚本进行本地训练。
|
||
\subsubsection{模型预测}
|
||
用户可以输入中文句子,也可以输入拼音进行合成。合成后的音频结果可以在平台直接播放,也可以点击下载进行下载保存。
|
||
|