目前当红的人工智能(Artificial intelligence,AI)主要聚焦在深度学习(DeepLearning,DL)领域,想学习深度学习技术的人,第一步通常会遇到一大堆框架(Framework)却不知如何选择,而究竟什么是框架?框架如何用来表示模型?哪些才是主流框架?本文将会完整告诉你,协助找出最符合自己需求的框架。
何谓深度学习框架?
深度学习简单示意图。
大家都知道只要准备一张纸和一只笔,加上源源不断的灵感,就能将想法转化成文字,创作出一篇令人感动的文章。但现在手写创作的人越来越少,只好选用一项电子书写(数字表达)的工具来创作。以Windows举例,可能用的是Note Pad(笔记本)、Word或PDF Editor,如果是学术写作的人可能较常用的是Latex,在网页上创作则可能是Html。
文章的好坏并不会因为工具的改变而有所不同,却会影响写作效率以及排版美观,改变读者对这篇文章的评价。虽然文章内容(基本元素)可轻易的在不同工具中转换,但遇到字体格式、图片、公式等特殊排版需求时,可能出现档案转不过去等问题,同时难以用来表达音乐、影像、视频。
在解决深度学习的问题中,较常见的是非时序性辨识问题,以及时序性的分析或预测问题。为了方便表达模型(Net /Model)的结构、工作训练以及推论流程,因此产生了框架,用来正确表达深度学习的模型,就像在Windows上写文章需要有Note Pad、Word等,编辑影音内容要有威力导演、After Effect等一样。
因此,许多学术单位、开源社群甚至Google、Microsoft、Facebook这类知名大公司也纷纷推出自家的框架,以确保在这场AI大战中能占有一席之地。而有另一派人马,想要产生另一种可轻易转成各家的框架,例如微软的Word可以另存网页档(*.html)、可携式文件格式(*.pdf)、纯文本档(*.txt)等。在介绍各家框架前,先来认识一下深度学习的模型究竟用了哪些元素?就像玩乐高积木前,要先知道有哪些模块可用,后续在学习各个框架的表示语法时才不会一头雾水。
常见深度学习模型介绍
首先介绍两个较著名的模型,包括非时序性的卷积神经网络(CNN) LeNet-5 [1]以及时序性的递归神经网络(RNN),方便说明模型中常用到的元素与流程,如何用深度学习框架来表示。
卷积神经网络(CNN)
图一卷积神经网络(CNN) LeNet-5 [1]
(图一)为最知名的卷积神经网络LeNet-5,主要是用来辨识手写数字(MNIST数据库),输入为一张8bit灰阶32×32像素的影像,而输出为十个节点,分别表示影像为十个数字的机率,这个模型几乎是所有研究深度学习的入门起手式。目前先不解释这个模型为何能学会辨识图像,而是单纯就模型组成以及表示方法来进行说明。
首先,说明卷积特征图 C1层,C1层上的红点,是由输入层(INPUT)红色框(5×5个像素)乘上5×5的卷积核加总后而得,依序由输入影像的左至右、上至下共享一个卷积核进行卷积,一次移动一个像素(Stride=1),如此即可产生一张特征图,而C1层共享了六组卷积核,因此产生六张28×28像素的特征图。再来将影像进行池化,较常见的方式就是把相邻四点(如图一绿色框所示)中最大的点当成新点,称为Max Pooling,同时把影像长宽都减为一半,成为S2层。
接下来,对S2层以16组3×3卷积核进行卷积,产生C3层,共有16组10×10像素的特征图。同样地再对C3层进行池化产生S4层,变成16组5×5像素的特征图,最后再以16组5×5卷积核把S4层的16个特征图卷积变成16个输入点,再以传统全链接神经网络进行链接。C5层就是以16个输入点和隐藏层120点进行全连结,并依指定的激活函数将输出传到下一层,接下来再和下一组隐藏层F6的84点进行全连结,最后再和输出层(OUTPUT)的十个输出点进行全连结,并正规化输出得到各输出的机率,即完成整个LeNet-5模型(网络)结构。
综合上述内容可得知一个基本的卷积神经网络会有输入层、卷积层、池化层、全连结层及输出层。卷积层要定义卷积核大小、移动距离、输出特征图数量。而池化层同样需要定义核的大小(一般是2×2)、移动距离(一般是2)及池化方式(可以是取最大值或平均值)。全连结层部份则需要定义节点数量及激活函数类型(如:reLu、sigmoid等),最后输出层除了要定义正规化机率值(如:Softmax)外,还要定义损失函数以作为训练模型用。
前面提到的卷积神经网络CNN是一种前馈(Forward)的单向网络,其输出结果不会影响输入,但如果遇到如语音、翻译、视频这类时序问题时,CNN就搞不定了,此时就该轮到递归神经网络(RNN)登场了。
递归神经网络(RNN)
图二 递归神经网络(RNN)及型态
(图二)左图所示就是RNN最基本入门的模型,把此次输出的结果经过加权后,再和下一次的输入一起计算出下一次的输出,以串起输入数据的时序关连。从展开图可更清楚看出其关连,当前输出(ot)是由目前状态(st)乘上权重(U)加上前一状态(st-1)输出乘上权重(W)后,经过双曲正切(tanh)函数并乘上输出权重(V),最后取Softmax算式得出,依此类推可展开成任意级数的网络。
(图二)右图所示,RNN可以有很多种输出型态,一对一就等于单纯的前馈网络没有时序关系,另外也可以一对多、多对一、多对多等不同的输出方式,应用于时序性内容分类,例如语句情绪意图、音乐曲风、视频动作分析、影像加注标题等,或是型态移转(Style Transfer),例如语言翻译、文章音乐创作等。
对RNN而言,需要定义展开的级数、隐含层(或称为状态S)到隐含层权重矩阵(W)、输入层到隐含层权重(U)、隐含层到输出层权重(V)、激活函数(例如:tanh等)类型,以及输出层机率正规化方式(例如:Softmax等)。