机器学习 - 揭开神经网络的神秘面纱

「纸上得来终觉浅,绝知此事要躬行」

近期拜读了吴恩达在 Coursea 的机器学习经典三剑客前两部分:

在 Andrew 和蔼而通俗易懂的讲解下,终是把平时一知半解的机器学习串起来了。很不错的课程,做的时候推荐把 quiz 和 Assignment Notebook 都做一遍。

本文不分享课程的公式、学习方法 & 笔记,因为这个是 Andrew 的工作。这里简单分享我在课程的思考 & 收获。

一、深度学习

机器学习是一门非常大的学科,这里首先区分好深度学习属于机器学习研究的一个子领域,粗略地讲,也可以把”神经网络 equals 深度学习“。本文围绕神经网络相关内容讨论。

二、神经网络的模型训练

”模型训练“ 具体训练的是啥?

在中小学,我们都写过一种找规律的题目,给出一组数字,找到规律,填写数字的第 4 个 or 第 6 个数字。这种题目本质上在于找到数据的关系,即函数 f(x)。

这里,如果非常粗略地去理解,这个其实就是所谓的”模型训练“做的事情:

  • 在题目中,你接受数字,找到数字的关系,从而能够预测出下一个数字,给你的数字越多,你对自己归纳的函数测试越多,你的函数变得越精确

  • 在模型中, 模型接受数据,找到数据的关系,从而能够预测出下一个数据,给模型的数据越多,模型对数据拟合的函数越多,模型的函数预测的数据越精确

模型训练在深度学习里一般称为 ”model fit“。这 fit 也不是 train 呀。fit 这里的意思是拟合,也即模型训练其实就是模型拟合,拟合做的事情就是在计算机中定义了一个 f(x) (神经网络一般是有很多 f(x) 组合起来的结果),并输入数据,尽可能地拟合这个 f(x),使得它可以准确地覆盖我们的数据关系。

例如我们定义平方关系 f(x) = x^2, 那么 f(1) = 1 ... f(3) = 9,在神经网络中,会有一些机制,像 loss 、梯度下降,让模型不断拟合,最后变成”你想要的形状“。

三、神经网络的简化版

计算机中的神经网络是对生物学中的神经网络拙劣地模仿。非常简单。神经网络由不同的层构成(例如全连接层,这里不懂不用太在意)。每一层又有不同的神经元,每个神经元做的事情就是函数计算 f(x)。

从上述章节,可以知道:神经网络一般是有很多 f(x) 组合起来的结果。但其实有时候有一些问题很简单, 可能只需要一个神经元,即 一个 f(x) 就能解决了。对于这种情况,用的技术叫做回归,例如线性关系的问题叫做线性回归,而非线性的关系,例如要做分类,就会用到逻辑回归。回归也是最早期的机器学习领域的技术之一。

不过往往现实世界中,有不少问题是非常复杂的,这种单个神经元不足以 handle。于是构建了多个神经元,多个层的神经网络。

四、神经网络的意图

经过上述不断地举例 f(x) ,现在我们可以知道。神经网络属于逻辑学派的一种研究。它认为世界万物均有逻辑、规律、状态。而这门学科,研究研究的是,将问题拆解为输入和输出,将这两部分参数化(专业术语叫做特征工程),输入给计算机,并让其找出输入和输出的规律(代价函数 & 梯度下降),最后试图推广这个找到的规律(训练好的模型)到新的输入,预测出对应的输出。

在神经网络的理解中,世界就是一个复杂的 f(x)。那么理论上输入的特征越多,拟合的 f(x) 越复杂的,那么这个模型就能解决更多问题?在 2017 年大二神经网络大火那一年,我当时就有了这个想法,果然 5 年后,ChatGPT 3.5 推出,验证了这条路是可行的。

解决世界万物的问题,这句话让人感到熟悉。每个哲学家都尝试找到”真理”,解决世间万物一切问题。而在计算机中,有个概念叫做 “世界模型”,也是研究的类似的问题,我认为在现阶段,比起“真理”,“世界模型”更现实,更贴近我们的生活。

五、神经网络的代码实例

import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
​
# 定义神经网络
model = Sequential([
    Dense(units=25, activation='sigmoid'),
    Dense(units=15, activation='sigmoid'),
    Dense(units=1, activation='sigmoid')
])
​
# 定义损失函数
from tensorflow.keras.losses import BinaryCrossentropy
model.compile(loss=BinaryCrossentropy())
​
# 训练模型
model.fit(X, Y, epochs=100)
​
  • dense 为全连接层,即神经网络中的层;这里除了全连接层,也会有 convolution,卷积层,神经元接收参数数量问题,不做多述

  • activation 为激活函数,即上文中举例多次的神经元的 f(x)

  • units 则是上文中说的神经元

  • BinaryCrossentropy 则是一种损失函数

  • X 和 Y 对应着上文说过的神经网络的输入 X 和输出 f(x)

六、神经网络的实际工作

对于算法模型的研发,一般不会如上文那样去自己完全定义一个神经网络,因为训练模型(拟合)需要不少时间,一般都会下载别人预训练的模型,并进行加减层微调一下模型。

对于算法模型落地的工程研发中,需要重点关注的是模型的输入和输出的数据处理。

后言

神经网络的训练其实有很多工作,除了数据处理、还有方差和偏差的诊断,错误分析等,远比此文讲述的内容要多。除了神经网络,也其他的解决方案用于解决预测问题,例如决策树。而有一些问题可能是聚类问题。尝试解决世界的所有问题并不容易。