2. 深度学习基础回顾:神经网络、激活函数、损失函数

说实话,做ADMET性质预测,很多人一上来就堆模型。但我觉得,先把最基础的几个东西搞明白,后面才不会跑偏。

这一章我不讲太多数学推导。我们就聊聊神经网络是怎么工作的,激活函数该怎么选,损失函数到底在算啥。嗯,这些都是我平时做项目时反复琢磨的东西。

2.1 神经元与网络结构

说白了,一个神经元就是做了一件事:先加权求和,再加一个偏置,最后通过激活函数输出。

我把这个流程拆成三步,你感受一下:

  1. 输入:来自上一层的数据,或者是原始特征。
  2. 计算:权重 × 输入 + 偏置,得到一个线性组合。
  3. 激活:把这个组合值扔进激活函数,决定要不要“激活”这个神经元。

我早期做项目时,总喜欢把网络堆得很深。后来发现,对于中小规模的数据集,浅层网络配合合适的正则化,效果反而更好。这就是为什么在ADMET吸收性质预测里,有时3-4层的全连接网络就够用了。

组件 作用 我在项目中踩过的坑
权重 控制输入特征的重要性 初始化太大会导致梯度爆炸
偏置 增加模型的拟合能力 有时忘了加,收敛特别慢
激活函数 引入非线性 选错了会让梯度消失

我的小习惯:对于分子指纹这类高维稀疏输入,我会在输入层后面先加一个BatchNorm层。这能稳定训练过程,让学习率可以设得更大。

下面这张图展示了本章要讲的核心知识点之间的关系,我习惯把它叫做“深度学习三件套”:

深度学习基础回顾:知识体系 神经元 加权求和 + 激活 网络结构 输入层 / 隐藏层 / 输出层 激活函数 ReLU / Sigmoid / Tanh 损失函数 MSE / Cross Entropy 这几部分相互配合:神经元组成网络,激活函数引入非线性,损失函数指导学习方向

2.2 激活函数:关键选择

激活函数这个东西,说白了就是给神经网络引入非线性的关键。如果没有它,你堆再多层也只是线性变换的叠加。

ReLU(Rectified Linear Unit)

这是我现在最常用的激活函数,尤其对于隐藏层。公式很简单:

ReLU(x) = max(0, x)

优点很明显:计算快、梯度不会在正半轴饱和。但有个问题——神经元会“死”。

我曾经在ADMET项目中遇到过:用ReLU做回归任务,模型训练到一半损失突然不降了。检查发现,输出层之前的一层大部分神经元都变成了0。这就是所谓的“神经元死亡”问题。

怎么解决呢?有几个变体:

  • Leaky ReLU:给负半轴一个很小的斜率,比如0.01。
  • PReLU:这个斜率也变成可学习参数。
  • ELU:负半轴是指数衰减,输出均值更接近0。

Sigmoid / Tanh

这两个现在用得少了,但我还是会用在输出层。比如二分类问题用Sigmoid。

它们有个共同问题:两端太容易饱和。梯度在值很大的地方几乎为0,深层网络根本学不动。

激活函数 输出范围 常见用途 我个人倾向
ReLU [0, +∞) 隐藏层 默认选择,配上He初始化
Leaky ReLU (-∞, +∞) 隐藏层 当ReLU出现死亡问题时尝试
Sigmoid (0, 1) 二分类输出层 回归任务基本不用
Tanh (-1, 1) 某些RNN场景 一般用别的代替

选型建议:隐藏层先用ReLU试试。如果训练不稳定或收敛慢,换成Leaky ReLU。输出层根据任务定,回归不用激活或者用线性。

2.3 损失函数:回归与分类的区别

损失函数,其实就是衡量模型预测跟真实值差距的函数。你想想看,模型学的方向全靠它指引。

均方误差(MSE)

这是做回归任务时最自然的选择,计算预测值与真实值之差的平方和:

MSE = 1/n * Σ(y_true - y_pred)²

我习惯用它来预测logD、溶解度这些连续值。不过有一点要注意:MSE对大误差非常敏感,因为误差被平方了。如果数据里有离群点,模型会拼命去拟合它。

避坑指南:在用ADMET数据集做回归时,我建议先检查一下目标变量的分布。如果分布呈长尾,取对数后再做回归往往效果更好。

平均绝对误差(MAE)

相比MSE,MAE对离群点不那么敏感:

MAE = 1/n * Σ|y_true - y_pred|

缺点是在优化时不如MSE平滑,梯度在0附近不连续。

交叉熵损失

这是分类任务的标准配置。对于二分类:

Binary Cross Entropy = -[y*log(p) + (1-y)*log(1-p)]

在ADMET预测中,很多任务是二分类的,比如判断化合物是否具有毒性、是否可透过血脑屏障。这时候,输出层用Sigmoid,损失函数用BCE,就是最直接的组合。

多分类时,输出层加Softmax:

Softmax(x_i) = exp(x_i) / Σexp(x_j)

然后接Categorical Cross Entropy。这个组合在药物分子活性分类中也经常出现。比如预测某个分子对某个靶点有、中、无三类活性。

2.4 前向传播与反向传播的逻辑

前向传播,我把它叫做“数据的一次旅行”。数据从输入层进入,经过每一层的加权、激活,最后到达输出层,得到一个预测值。

反向传播,更像是“错误信息的逆流”。计算预测值和真实值的差距,然后一层层往回传,更新每一层的权重。

梯度下降是核心,我习惯用这样的代码片段来表示一次更新:

# 一次梯度下降的简化逻辑
weights = weights - learning_rate * gradients

梯度就是损失函数对权重的导数,告诉我们应该往哪个方向调整权重。

记住:我是做分子性质预测的,不是做图像识别的。所以我的网络通常不会特别深(3-6层就够了)。对于ADMET任务,简单网络往往比复杂网络更稳定、更易复现,而且更不容易过拟合。

2.5 小结与下一步思路

这一章我们聊了:

  • 神经单元的结构,说白了就是加权加偏置再加激活函数。
  • ReLU家族和Sigmoid/Tanh的选型区别,以及我踩过的坑。
  • 损失函数,MSE做回归,交叉熵做分类,各有各的适用场景。

这些都是很基础的东西。但说真的,我每次做新项目时,都会重新审视这些基础选择。有时候换一个激活函数或者损失函数,AUC就能涨好几个点。别小看这些细节。

我推荐的做法:建立一个小的测试集,快速对比不同激活函数和损失函数组合。不要花太多时间在理论上纠结,跑两轮就能看出来效果。

这些基础知识就像是地基,扎实了后面才能建高楼。后面我们会一步步搭建实际的ADMET预测模型,到那时候你会发现,今天我们聊的这些选择,每一个都会直接影响最终的结果。