深度学习应用中需要思考的问题

对于下列问题,我们无法给出统一的回答,因为答案取决于您想要解决的具体问题。但是,我们希望本页中列出的各项因素能引导您在初期系统地思考如何选择算法和工具:

     
  • 我要解决的是有监督学习问题,还是无监督问题?如果是有监督学习,那么是分类问题还是回归问题?有监督学习是有“老师”的。这位“老师”就是一个确定输入和输出数据之间关联的训练数据集。例如,您可能需要标记图像。在这种分类问题中,输入是原始像素,而输出则是图片中的事物的名称。而在回归问题中,您可能需要教授神经网络如何预测连续值,例如根据住房面积这样的输入数据来判断房子的价格。无监督学习则能通过分析未标记的数据来检测相似性或异常状况。无监督学习没有“老师”;具体应用包括图像搜索和欺诈检测等。
  • 如果是有监督学习,需要处理的标签数量有多少?需要准确标记的标签数量越多,问题的计算强度也就越大。ImageNet的训练数据集约有1000个类别;而鸢尾花数据库则只有3个类别。
  • 每个批次应当包含多少数据?一个批次指的是数据集中的一组样例或实例,比如一组图像。在训练过程中,一个批次的实例全部输入神经网络,网络对这些实例进行预测,然后依据所有预测误差的平均值来更新模型的权重。批次越大,两次更新之间的等待时间(或称学习步骤)就越长。批次较小意味着网络从每个批次中学到的与问题数据集相关的信息较少。如果您有大量数据,一开始不妨将批次大小设定为1000,对于一些问题可以取得较好的学习效果。
  • 需要处理的特征数量有多少?特征数量越多,需要的内存也越大。就图像而言,第一层的特征数量等于图像所包含的像素数。所以MNIST数据集中的28 x 28像素的图像有784个特征。医疗诊断中的图像则可能有14兆像素。
  • 同样的问题,另一种表述是:应当选择哪种网络架构?微软研究院开发的Resnet网络在最近的ImageNet大赛中获得冠军,该网络有150个层。在其他条件相同的情况下,层数越多,需要处理的特征越多,所需要的内存也就越大。多层感知器(MLP)中的一个稠密层的特征密集度要远高于一个卷积层。人们之所以使用包含二次抽样层的卷积网络,正是因为这样可以大刀阔斧地“修剪”需要运算的特征。
  • 要用怎样的方法来调试神经网络?许多人可能还对神经网络调试感到有些云里雾里。具体的操作方式有以下几种。可以根据实践经验来调试:观察网络的F1值,然后调整超参数。您也可以用超参数优化工具来实现一定程度的自动化调试。最后,您还可以采用示意性方法,比如用一个GUI来明确显示误差下降的速度以及激活分布的状况。
  • 模型训练需要多少数据?怎样找到这些数据?
  • 硬件:使用GPU、CPU还是两者并用?用单一GPU系统还是分布式系统?目前许多研究是用1~4个GPU的系统开展的。企业级解决方案通常需要更多资源,因此还必须使用大型CPU集群。
  • 要使用哪种数据加工管道?如何进行数据的提取、转换和加载(ETL)?数据是在Oracle数据库中吗?还是在Hadoop集群上? 数据是在本地还是云端?
  • 如何提取数据中的特征?虽然深度学习可以自动提取特征,但您可以用不同形式的特征工程来减轻计算负荷,加快训练速度,尤其是在特征比较稀疏的情况下。
  • 应使用何种非线性函数、损失函数和权重初始化方式?非线性函数是与深度神经网络中每个层相对应的激活函数,可能是sigmoid函数、修正线性单元或其他函数。每种非线性函数通常与特定的损失函数搭配。
  • 解决这个问题的最简架构是什么?并非所有人都愿意或有能力用Resnet来进行图像分类。
  • 网络在哪里进行训练?模型要部署到哪里?需要与哪种平台集成?大多数人直到完成一个的原型时才开始思考这些问题,此时他们往往得用可扩展性更强的工具来重写自己的网络。您应当提前考虑最终需要使用的是Spark、AWS、Hadoop,还是别的平台。

欢迎使用Deeplearning4j的Java开发者加入我们的Gitter线上交流群,社区中的成员会根据具体情况来帮助您回答上述问题。


其他基础教程

与我们在Gitter聊天