神经网络基础
本章目录
学完后,你应能独立完成
- 推导两层MLP反向传播并检查9维参数
- 解释初始化、train/eval与权重衰减
- 按同一研究政策比较网络与简单基线
改变一个条件,观察发生什么
浏览器内即时教学计算;Python 实验结果另列于代码区。图形与数值一起核对。
前向传播先画维度表
X是n×p,W₁是p×h,b₁是h;隐藏A=φ(XW₁+b₁)是n×h,W₂是h×1,输出ŷ=AW₂+b₂。损失用SSE/(2n)。页面代码用p=h=2的tanh网络,参数一共9个,便于逐项检查。
网络自动学平滑交互不意味着应先选深网络。股票日期依赖、信噪比、状态变化和搜索预算同样限制它。先让少量样本损失能下降,再接合法未来验证。
反传就是复用链式法则
残差对输出的梯度D₂=(ŷ−y)/n,n×1。tanh导数1−A²,把输出梯度传回隐藏层,再左乘Xᵀ得到W₁梯度。偏置沿样本维求和,形状必须与参数一致。
- D₂已经包含1/n,后面不要重复平均。
- b₂梯度为D₂求和,b₁梯度按列求和。
- 展平顺序与参数解包顺序完全一致。
- 做有限差分,同时用零输入的手算例核对损失含义。
初始化与梯度问题
全零隐藏初始化会维持单元对称;随机尺度要与激活和fan-in匹配。Sigmoid导数至多.25且会饱和,多层Jacobian连乘可能消失或爆炸。ReLU正区导数1,也会出现死亡单元。
梯度裁剪限制过大更新,不修复消失、错标签或错归一化。出现NaN先查输入非有限值、损失稳定性、尺度与学习率,再决定是不是网络容量问题。
训练与推断的状态不能混
Inverted Dropout保留概率q时训练用m⊙a/q,均值保持a,推断通常不屏蔽;非线性下不能简单称精确模型平均。BatchNorm训练用batch统计,推断通常用训练累计统计;LayerNorm按样本特征维归一化,机制不同。
测试时更新训练统计或让未来留出混进batch会改变政策。eval关闭训练行为,不等同于禁用梯度计算;二者是不同控制。这里的NumPy小网络没有Dropout或BN,用于专注链式导数。
优化与正则的实现差异
普通GD加L2时更新为(1−ηλ)w−ηg,与相应权重衰减同形式;Adam自适应缩放下耦合L2与decoupled decay不同,AdamW明确分离。偏置与归一化参数是否衰减也要声明。
早停、优化器、初始化、学习率和宽度都是选择。用相同日期、信息集、评价集合与事先预算比较Ridge、树和小MLP。一个种子领先不应成为扩大网络的唯一依据。
序列架构作为岗位扩展
CNN利用局部卷积与共享权重,RNN/LSTM递推状态,Attention计算softmax(QKᵀ/√d)V。QKᵀ为L×L,输入窗口的时点和mask决定信息是否可用。
只含当前及之前已知数据的整段过去窗口,可以合法使用窗口内双向注意力;若对每个历史时刻分别作预测,则要按该时刻遮未来。不是所有金融任务都机械需要同一causal mask。
从算法到一次真实运行
代码在本地 Python 中执行,HTML 内展示参考实现和本轮运行结果。请先独立完成练习,再展开完整参考文件。
def mlp_loss_grad(X, y, theta):
"""2 inputs -> 2 tanh hidden units -> 1 output; flattened 9 parameters."""
W1,b1,W2,b2 = theta[:4].reshape(2,2),theta[4:6],theta[6:8].reshape(2,1),theta[8]
hidden = np.tanh(X@W1+b1)
residual = hidden@W2+b2-y
loss = float(np.sum(residual**2)/(2*len(X)))
output_grad = residual/len(X)
hidden_grad = (output_grad@W2.T)*(1-hidden**2)
gradient = np.r_[(X.T@hidden_grad).ravel(),hidden_grad.sum(0),
(hidden.T@output_grad).ravel(),output_grad.sum()]
return loss,gradient"""Standalone synthetic teaching example. Run locally with Python, not in the HTML."""
import json
import numpy as np
import pandas as pd
from scipy.special import expit
def clean(value):
if isinstance(value, dict): return {str(k):clean(v) for k,v in value.items()}
if isinstance(value,(list,tuple,np.ndarray)): return [clean(v) for v in value]
if isinstance(value,(np.integer,)): return int(value)
if isinstance(value,(float,np.floating)): return float(value) if np.isfinite(value) else None
if isinstance(value,(np.bool_,)): return bool(value)
return value
def print_result(result):
print(json.dumps(clean(result),ensure_ascii=False,allow_nan=False))
def mlp_loss_grad(X, y, theta):
"""2 inputs -> 2 tanh hidden units -> 1 output; flattened 9 parameters."""
W1,b1,W2,b2 = theta[:4].reshape(2,2),theta[4:6],theta[6:8].reshape(2,1),theta[8]
hidden = np.tanh(X@W1+b1)
residual = hidden@W2+b2-y
loss = float(np.sum(residual**2)/(2*len(X)))
output_grad = residual/len(X)
hidden_grad = (output_grad@W2.T)*(1-hidden**2)
gradient = np.r_[(X.T@hidden_grad).ravel(),hidden_grad.sum(0),
(hidden.T@output_grad).ravel(),output_grad.sum()]
return loss,gradient
if __name__ == "__main__":
rng=np.random.default_rng(42)
X=rng.normal(size=(32,2)); y=(np.sin(X[:,0])+X[:,1]*.3)[:,None]
theta=rng.normal(0,.3,9); eps=1e-6
loss,gradient=mlp_loss_grad(X,y,theta)
numeric=np.array([(mlp_loss_grad(X,y,theta+eps*e)[0]-mlp_loss_grad(X,y,theta-eps*e)[0])/(2*eps)
for e in np.eye(9)])
np.testing.assert_allclose(gradient,numeric,atol=1e-8)
max_error=abs(gradient-numeric).max(); initial=loss
for _ in range(600):
loss,gradient=mlp_loss_grad(X,y,theta)
theta-=.05*gradient
final,_=mlp_loss_grad(X,y,theta)
assert final<initial
print_result({"gradient_max_error":max_error,"initial_training_loss":initial,
"final_training_loss":final,"scope":"training demonstration, not financial OOS evidence"})
查看本轮本地运行记录 · 2026-10-12
{
"gradient_max_error": 4.617861648625876e-11,
"initial_training_loss": 0.38257753883408396,
"final_training_loss": 0.004296316344796026,
"scope": "training demonstration, not financial OOS evidence"
}先回答,再看提示和答案
X(n,10)、隐藏4个单元,W₁梯度形状是什么?
一级提示
写出矩阵乘法维度。
参考答案与条件
(10,4),与W₁一致。Xᵀ是10×n,D₁是n×4。
梯度消失可以靠global norm clipping修复吗?
一级提示
先写出目标、信息集和所需条件。
参考答案与条件
通常不可以。裁剪主要限制过大的梯度,不能使消失梯度恢复。
MLP训练误差更低,能宣布因子合成更好吗?
一级提示
先写出目标、信息集和所需条件。
参考答案与条件
不能。需同条件未来验证、选择压力与稳定性分析,并检查最终交易约束。
把知识迁移到一个新任务
独立写9参数tanh网络的损失与梯度,按参数逐项中央差分;记录固定初始化下训练loss。再解释它为什么尚未证明股票未来预测增量。
这里保存学习笔记,不在浏览器执行 Python。A/B/C 由你按独立完成程度填写。
参考与进一步阅读
在线文档可能比本地固定版本更新;API 行为以已验证代码和版本记录为准。
掌握状态与复习
关掉资料独立完成后记 A;提示后完成记 B;需要重学记 C。
记录尽量保存在当前浏览器,建议定期导出备份。