🤔 从大脑说起:为什么我们需要神经网络?
还记得前面学的算法吗?
- 线性回归:只能画直线预测
- 逻辑回归:只能画直线分类
- 决策树:能做复杂决策,但对图像、声音束手无策
但人类大脑却能轻松做到:
- 一眼认出照片里的猫 🐱
- 听懂方言说话 🗣️
- 学会骑自行车 🚲(即使多年不骑也不会忘记)
秘密就在于:大脑有860亿个神经元组成的复杂网络!
神经网络就是科学家模仿大脑工作方式发明的AI算法。
🧠 生物神经元 vs 人工神经元
🔬 生物神经元的工作原理
想象一个生物神经元就像一个小工厂:
树突(接收信息) → 细胞体(处理信息) → 轴突(输出信息)
↑ ↓ ↓
其他神经元 决定是否激活 传递给下一个神经元
工作流程:
- 接收信号:从其他神经元的树突接收电信号
- 加权求和:不同来源的信号有不同的重要性
- 激活判断:如果总信号超过阈值,就"兴奋"并传递信号
- 传递信号:通过轴突传给下一个神经元
⚡ 人工神经元的设计
科学家按照这个原理设计了人工神经元:
import numpy as np
import matplotlib.pyplot as plt
class ArtificialNeuron:
def __init__(self, n_inputs):
"""
初始化人工神经元
n_inputs: 输入信号的数量
"""
# 权重:每个输入信号的重要性(类似生物神经元的突触强度)
self.weights = np.random.randn(n_inputs) * 0.1
# 偏置:激活阈值(类似生物神经元的兴奋阈值)
self.bias = np.random.randn() * 0.1
def activate(self, inputs):
"""
激活函数:决定神经元是否"兴奋"
"""
# 加权求和:inputs·weights + bias
weighted_sum = np.dot(inputs, self.weights) + self.bias
# 使用阶跃函数作为激活函数(早期简单版本)
if weighted_sum >= 0:
return 1 # 兴奋状态
else:
return 0 # 抑制状态
def sigmoid_activate(self, inputs):
"""
使用Sigmoid函数作为激活函数(现代常用)
"""
weighted_sum = np.dot(inputs, self.weights) + self.bias
# Sigmoid函数:把任意值压缩到0-1之间
return 1 / (1 + np.exp(-weighted_sum))
# 演示单个神经元
neuron = ArtificialNeuron(3) # 3个输入的神经元
print("=== 单个神经元演示 ===")
print(f"初始权重: {neuron.weights}")
print(f"初始偏置: {neuron.bias:.3f}")
# 测试不同输入
test_inputs = [
[0, 0, 0], # 全无信号
[1, 0, 0], # 只有第一个输入有信号
[1, 1, 0], # 前两个输入有信号
[1, 1, 1], # 所有输入都有信号
]
print(f"\n阶跃激活函数结果:")
for inputs in test_inputs:
output = neuron.activate(inputs)
weighted_sum = np.dot(inputs, neuron.weights) + neuron.bias
print(f"输入{inputs} → 加权和={weighted_sum:.3f} → 输出={output}")
print(f"\nSigmoid激活函数结果:")
for inputs in test_inputs:
output = neuron.sigmoid_activate(inputs)
print(f"输入{inputs} → 输出={output:.3f}")
运行结果会显示神经元如何根据输入的加权和来决定输出!
🕸️ 从神经元到神经网络
📡 单层感知机:第一个神经网络
把多个神经元连接起来,就形成了神经网络:
class SingleLayerPerceptron:
"""
单层感知机:最早的神经网络(只能解决线性可分问题)
"""
def __init__(self, n_inputs, n_outputs):
self.neurons = []
for _ in range(n_outputs):
self.neurons.append(ArtificialNeuron(n_inputs))
def predict(self, inputs):
"""前向传播:输入 → 输出"""
outputs = []
for neuron in self.neurons:
outputs.append(neuron.sigmoid_activate(inputs))
return np.array(outputs)
# 演示单层感知机解决AND逻辑问题
print("=== 单层感知机解决AND问题 ===")
def and_gate(x1, x2):
"""真实的AND逻辑门"""
return 1 if (x1 == 1 and x2 == 1) else 0
# 训练数据:AND真值表
and_training_data = [
([0, 0], 0),
([0, 1], 0),
([1, 0], 0),
([1, 1], 1)
]
# 创建单层感知机(2个输入,1个输出)
and_perceptron = SingleLayerPerceptron(2, 1)
print("AND逻辑门真值表:")
print("X1 X2 | 真实输出 | 预测输出")
print("-" * 30)
for inputs, true_output in and_training_data:
prediction = and_perceptron.predict(inputs)[0]
real_result = and_gate(inputs[0], inputs[1])
print(f"{inputs[0]} {inputs[1]} | {real_result} | {prediction:.3f}")
🚫 单层感知机的局限:XOR问题
但是单层感知机有个致命缺陷——无法解决异或(XOR)问题!
def demonstrate_xor_problem():
"""演示单层感知机无法解决XOR问题"""
def xor_gate(x1, x2):
"""真实的XOR逻辑门:不同时为1"""
return 1 if (x1 != x2) else 0
# XOR真值表
xor_data = [
([0, 0], 0),
([0, 1], 1),
([1, 0], 1),
([1, 1], 0)
]
print("=== XOR问题:单层感知机的滑铁卢 ===")
print("XOR逻辑门真值表:")
print("X1 X2 | 真实输出 | 单层感知机预测")
print("-" * 35)
# 尝试用单层感知机
xor_perceptron = SingleLayerPerceptron(2, 1)
for inputs, true_output in xor_data:
prediction = xor_perceptron.predict(inputs)[0]
real_result = xor_gate(inputs[0], inputs[1])
print(f"{inputs[0]} {inputs[1]} | {real_result} | {prediction:.3f}")
print(f"\n问题分析:XOR问题是线性不可分的!")
print(f"无法用一条直线把(0,1)和(1,0)分为一类,(0,0)和(1,1)分为另一类")
# 可视化XOR问题
plt.figure(figsize=(8, 6))
# 绘制数据点
xor_points = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
xor_labels = np.array([0, 1, 1, 0])
colors = ['red' if label == 0 else 'blue' for label in xor_labels]
plt.scatter(xor_points[:, 0], xor_points[:, 1], c=colors, s=100,
edgecolors='black', alpha=0.7)
# 尝试画决策边界(单层感知机的直线)
# 由于权重是随机的,我们尝试几个可能的直线
plt.axhline(y=0.5, color='gray', linestyle='--', alpha=0.5, label='可能的决策边界')
plt.axvline(x=0.5, color='gray', linestyle='--', alpha=0.5)
plt.xlabel('X1')
plt.ylabel('X2')
plt.title('XOR问题可视化:红色(0)=同类,蓝色(1)=同类\n一条直线无法完美分开两类!')
plt.legend()
plt.grid(True, alpha=0.3)
plt.xlim(-0.5, 1.5)
plt.ylim(-0.5, 1.5)
plt.show()
demonstrate_xor_problem()
这就是为什么我们需要多层神经网络!
🏗️ 多层神经网络:解决复杂问题
🎯 多层感知机(MLP):XOR问题的解决者
class MultiLayerPerceptron:
"""
多层感知机:包含隐藏层的神经网络
可以解决XOR等非线性的问题!
"""
def __init__(self, layer_sizes):
"""
layer_sizes: 每层神经元数量的列表
例如[2, 4, 1]表示:输入层2个神经元,隐藏层4个,输出层1个
"""
self.layers = []
# 创建每一层(除了输入层)
for i in range(len(layer_sizes) - 1):
layer = []
# 当前层的每个神经元
for j in range(layer_sizes[i + 1]):
# 每个神经元连接到前一层的所有神经元
neuron = ArtificialNeuron(layer_sizes[i])
layer.append(neuron)
self.layers.append(layer)
def forward(self, inputs):
"""前向传播:数据从输入层流向输出层"""
current_activations = np.array(inputs)
# 逐层传播
for layer in self.layers:
next_activations = []
for neuron in layer:
activation = neuron.sigmoid_activate(current_activations)
next_activations.append(activation)
current_activations = np.array(next_activations)
return current_activations
# 解决XOR问题的多层神经网络
print("=== 多层神经网络解决XOR问题 ===")
# 网络结构:2个输入,4个隐藏神经元,1个输出
xor_network = MultiLayerPerceptron([2, 4, 1])
print("网络结构: 输入层(2) → 隐藏层(4) → 输出层(1)")
# 测试XOR问题
xor_data = [
([0, 0], 0),
([0, 1], 1),
([1, 0], 1),
([1, 1], 0)
]
print(f"\nXOR问题解决结果:")
print("X1 X2 | 真实输出 | 神经网络输出")
print("-" * 35)
for inputs, true_output in xor_data:
prediction = xor_network.forward(inputs)[0]
predicted_class = 1 if prediction > 0.5 else 0
print(f"{inputs[0]} {inputs[1]} | {true_output} | {prediction:.3f} ({predicted_class})")
print(f"\n成功!神经网络学会了XOR逻辑!")
print(f"关键在于隐藏层创造了非线性决策边界!")
🎨 可视化神经网络的决策边界
def visualize_neural_network_decision_boundary():
"""可视化神经网络如何解决XOR问题"""
# 生成更密集的测试点
x = np.linspace(-0.5, 1.5, 50)
y = np.linspace(-0.5, 1.5, 50)
xx, yy = np.meshgrid(x, y)
# 预测每个点的类别
Z = np.zeros(xx.shape)
for i in range(xx.shape[0]):
for j in range(xx.shape[1]):
Z[i, j] = xor_network.forward([xx[i, j], yy[i, j]])[0]
# 转换为分类结果
Z_class = (Z > 0.5).astype(int)
plt.figure(figsize=(10, 8))
# 绘制决策区域
plt.contourf(xx, yy, Z_class, alpha=0.6, cmap=plt.cm.RdYlBu)
plt.contour(xx, yy, Z_class, colors='black', linewidths=0.8)
# 绘制原始数据点
xor_points = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
xor_labels = np.array([0, 1, 1, 0])
colors = ['red' if label == 0 else 'blue' for label in xor_labels]
plt.scatter(xor_points[:, 0], xor_points[:, 1], c=colors, s=150,
edgecolors='black', linewidth=2)
# 标注数据点
for i, (point, label) in enumerate(zip(xor_points, xor_labels)):
plt.annotate(f'({point[0]},{point[1]})→{label}',
point, xytext=(10, 10), textcoords='offset points',
bbox=dict(boxstyle='round,pad=0.3', facecolor='white', alpha=0.8))
plt.xlabel('输入1')
plt.ylabel('输入2')
plt.title('神经网络解决XOR问题\n红色区域=输出0,蓝色区域=输出1\n复杂的曲线边界成功分开了两类点!')
plt.grid(True, alpha=0.3)
plt.xlim(-0.5, 1.5)
plt.ylim(-0.5, 1.5)
plt.show()
visualize_neural_network_decision_boundary()
看到了吗?神经网络学会了画曲线边界,而不仅仅是一条直线!
🧠 神经网络的核心组件详解
1️⃣ 激活函数:给网络注入非线性
def compare_activation_functions():
"""比较不同的激活函数"""
x = np.linspace(-5, 5, 100)
# 各种激活函数
def step_function(x):
return np.where(x >= 0, 1, 0)
def sigmoid_function(x):
x = np.clip(x, -250, 250) # 防止溢出
return 1 / (1 + np.exp(-x))
def tanh_function(x):
x = np.clip(x, -250, 250)
return np.tanh(x)
def relu_function(x):
return np.maximum(0, x)
def leaky_relu_function(x):
return np.where(x >= 0, x, 0.01 * x)
# 绘图比较
plt.figure(figsize=(15, 10))
activations = [
(step_function, 'Step (阶跃函数)', 'blue'),
(sigmoid_function, 'Sigmoid', 'red'),
(tanh_function, 'Tanh', 'green'),
(relu_function, 'ReLU', 'orange'),
(leaky_relu_function, 'Leaky ReLU', 'purple')
]
for i, (func, name, color) in enumerate(activations, 1):
plt.subplot(2, 3, i)
y = func(x)
plt.plot(x, y, color, linewidth=2)
plt.title(name)
plt.grid(True, alpha=0.3)
plt.axhline(y=0, color='black', linestyle='-', alpha=0.3)
plt.axvline(x=0, color='black', linestyle='-', alpha=0.3)
plt.tight_layout()
plt.show()
print("激活函数特点总结:")
print("• Step: 早期使用,现在很少用(不可导)")
print("• Sigmoid: 输出0-1,容易饱和(梯度消失)")
print("• Tanh: 输出-1到1,比Sigmoid稍好")
print("• ReLU: 最流行!计算简单,缓解梯度消失")
print("• Leaky ReLU: ReLU的改进,避免'死亡神经元'")
compare_activation_functions()
2️⃣ 损失函数:衡量预测的好坏
def neural_network_loss_functions():
"""演示神经网络的不同损失函数"""
# 模拟真实值和预测值
y_true = np.array([1, 0, 1, 0, 1])
y_pred_perfect = np.array([0.9, 0.1, 0.8, 0.2, 0.9]) # 完美预测
y_pred_ok = np.array([0.7, 0.3, 0.6, 0.4, 0.7]) # 还不错
y_pred_bad = np.array([0.3, 0.7, 0.4, 0.6, 0.3]) # 很差
def binary_cross_entropy(y_true, y_pred):
"""二分类交叉熵损失"""
epsilon = 1e-15
y_pred = np.clip(y_pred, epsilon, 1 - epsilon)
return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))
def mean_squared_error(y_true, y_pred):
"""均方误差损失"""
# 先将概率转换为0/1
y_pred_binary = (y_pred > 0.5).astype(float)
return np.mean((y_true - y_pred_binary) ** 2)
losses = {
'完美预测': {
'交叉熵': binary_cross_entropy(y_true, y_pred_perfect),
'均方误差': mean_squared_error(y_true, y_pred_perfect)
},
'还不错': {
'交叉熵': binary_cross_entropy(y_true, y_pred_ok),
'均方误差': mean_squared_error(y_true, y_pred_ok)
},
'很差': {
'交叉熵': binary_cross_entropy(y_true, y_pred_bad),
'均方误差': mean_squared_error(y_true, y_pred_bad)
}
}
print("=== 神经网络损失函数比较 ===")
print("真实值:", y_true.tolist())
print("\n不同预测的Loss值:")
print("预测质量 | 交叉熵损失 | 均方误差损失")
print("-" * 45)
for quality, loss_dict in losses.items():
ce_loss = loss_dict['交叉熵']
mse_loss = loss_dict['均方误差']
print(f"{quality:8} | {ce_loss:.3f} | {mse_loss:.3f}")
print(f"\n观察:")
print(f"• 交叉熵对错误预测更敏感(惩罚更严重)")
print(f"• 神经网络通常用交叉熵作为分类损失函数")
neural_network_loss_functions()
3️⃣ 反向传播:神经网络如何学习
这是最核心的部分!神经网络通过反向传播来学习:
def explain_backpropagation():
"""用简单例子解释反向传播"""
print("=== 反向传播简单解释 ===")
print()
print("类比:教小孩认猫")
print("1. 小孩看到一只猫,说是'狗' ❌")
print("2. 大人说:不对,这是猫,你看这些特征...")
print("3. 小孩调整大脑中对'猫'的理解")
print("4. 下次看到类似的动物,更容易认对 ✓")
print()
print("反向传播就是这样工作的:")
print("1. 神经网络做出预测")
print("2. 计算预测错误的程度(损失)")
print("3. 从输出层向输入层'反向'传播错误信息")
print("4. 调整每个连接的权重,减少错误")
print()
# 简化的反向传播演示
class SimpleBackpropDemo:
def __init__(self):
# 简单的两层网络:2→3→1
self.w1 = np.random.randn(2, 3) * 0.5 # 输入到隐藏层权重
self.b1 = np.random.randn(3) * 0.5 # 隐藏层偏置
self.w2 = np.random.randn(3, 1) * 0.5 # 隐藏层到输出权重
self.b2 = np.random.randn(1) * 0.5 # 输出层偏置
def forward(self, x):
# 前向传播
self.z1 = np.dot(x, self.w1) + self.b1 # 隐藏层输入
self.a1 = 1 / (1 + np.exp(-self.z1)) # 隐藏层激活
self.z2 = np.dot(self.a1, self.w2) + self.b2 # 输出层输入
self.a2 = 1 / (1 + np.exp(-self.z2)) # 输出层激活
return self.a2
def backward(self, x, y, learning_rate=0.1):
# 简化的反向传播(只演示一轮)
m = 1 # 样本数
# 输出层误差
dz2 = self.a2 - y
dw2 = (1/m) * np.dot(self.a1.T, dz2)
db2 = (1/m) * np.sum(dz2, axis=0)
# 隐藏层误差
dz1 = np.dot(dz2, self.w2.T) * self.a1 * (1 - self.a1) # sigmoid导数
dw1 = (1/m) * np.dot(x.T, dz1)
db1 = (1/m) * np.sum(dz1, axis=0)
# 更新权重
self.w2 -= learning_rate * dw2
self.b2 -= learning_rate * db2
self.w1 -= learning_rate * dw1
self.b1 -= learning_rate * db1
# 演示学习过程
demo_nn = SimpleBackpropDemo()
# 训练数据:AND问题
X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y_train = np.array([[0], [0], [0], [1]])
print("学习AND逻辑(简化演示):")
print("轮次 输入 目标 预测 损失")
print("-" * 35)
for epoch in range(10):
total_loss = 0
for i in range(len(X_train)):
x = X_train[i:i+1]
y = y_train[i:i+1]
# 前向传播
prediction = demo_nn.forward(x)
loss = -(y * np.log(prediction + 1e-15) + (1-y) * np.log(1-prediction + 1e-15))
total_loss += loss[0, 0]
# 反向传播
demo_nn.backward(x, y, learning_rate=1.0)
if epoch == 0 or epoch == 9: # 只显示第1轮和第10轮
pred_val = 1 if prediction[0, 0] > 0.5 else 0
print(f"{epoch+1:2d} {x.flatten()} {y[0,0]} {prediction[0,0]:.3f}({pred_val}) {loss[0,0]:.3f}")
if epoch == 0 or epoch == 9:
print(f"平均损失: {total_loss/4:.3f}")
if epoch == 9:
print(f"\n学习完成!神经网络学会了AND逻辑!")
explain_backpropagation()
🛠️ 用sklearn体验神经网络
from sklearn.neural_network import MLPClassifier
from sklearn.datasets import make_moons
from sklearn.preprocessing import StandardScaler
# 创建非线性可分数据
X_moons, y_moons = make_moons(n_samples=200, noise=0.2, random_state=42)
print("=== sklearn神经网络实战 ===")
print(f"数据形状: {X_moons.shape}")
print(f"类别分布: {np.bincount(y_moons)}")
# 数据预处理(神经网络对尺度敏感)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_moons)
# 训练神经网络
mlp = MLPClassifier(
hidden_layer_sizes=(10, 5), # 两个隐藏层:10个神经元,5个神经元
activation='tanh', # 激活函数
solver='adam', # 优化器
max_iter=1000, # 最大迭代次数
random_state=42
)
mlp.fit(X_scaled, y_moons)
# 预测和评估
train_predictions = mlp.predict(X_scaled)
accuracy = np.mean(train_predictions == y_moons)
print(f"训练准确率: {accuracy:.3f}")
# 可视化决策边界
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.scatter(X_moons[:, 0], X_moons[:, 1], c=y_moons, cmap=plt.cm.RdYlBu,
edgecolors='black', s=30)
plt.title('原始数据分布')
plt.subplot(1, 2, 2)
x_min, x_max = X_moons[:, 0].min() - 0.5, X_moons[:, 0].max() + 0.5
y_min, y_max = X_moons[:, 1].min() - 0.5, X_moons[:, 1].max() + 0.5
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
np.arange(y_min, y_max, 0.02))
Z = mlp.predict(scaler.transform(np.c_[xx.ravel(), yy.ravel()]))
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.6, cmap=plt.cm.RdYlBu)
plt.contour(xx, yy, Z, colors='black', linewidths=0.8)
plt.scatter(X_moons[:, 0], X_moons[:, 1], c=y_moons, cmap=plt.cm.RdYlBu,
edgecolors='black', s=20, alpha=0.7)
plt.title('神经网络决策边界\n复杂的非线性边界成功分开了月亮形状的两类数据!')
plt.xlabel('特征1')
plt.ylabel('特征2')
plt.tight_layout()
plt.show()
# 网络结构信息
print(f"\n网络结构信息:")
print(f"输入层: {X_scaled.shape[1]} 个神经元")
print(f"隐藏层: {mlp.hidden_layer_sizes} (共{sum(mlp.hidden_layer_sizes)}个神经元)")
print(f"输出层: {mlp.n_outputs_} 个神经元")
print(f"总层数: {mlp.n_layers_}")
print(f"实际迭代次数: {mlp.n_iter_}")
🤖 神经网络的实际威力
🖼️ 图像识别能力
def demonstrate_nn_power():
"""展示神经网络的强大能力"""
print("=== 神经网络的惊人能力 ===")
print()
capabilities = {
"图像识别": {
"能力": "识别照片中的物体、人脸、文字",
"例子": "手机拍照识物、人脸识别解锁、OCR文字识别",
"原理": "卷积神经网络(CNN)专门处理图像"
},
"自然语言处理": {
"能力": "理解、生成人类语言",
"例子": "ChatGPT对话、机器翻译、情感分析",
"原理": "循环神经网络(RNN)和Transformer处理序列"
},
"游戏AI": {
"能力": "学会玩复杂游戏并超越人类",
"例子": "AlphaGo围棋、DQN玩Atari游戏",
"原理": "强化学习 + 深度神经网络"
},
"创作能力": {
"能力": "生成艺术作品、音乐、代码",
"例子": "AI绘画、音乐创作、自动编程",
"原理": "生成对抗网络(GAN)和变分自编码器"
}
}
for domain, info in capabilities.items():
print(f"🎯 {domain}:")
print(f" 能力: {info['能力']}")
print(f" 例子: {info['例子']}")
print(f" 原理: {info['原理']}")
print()
print("神经网络之所以如此强大,是因为:")
print("1. 🧠 模仿大脑的分布式并行处理")
print("2. 🕸️ 多层网络可以学习数据的层次化特征")
print("3. 🔄 反向传播让网络能够从错误中学习")
print("4. 💪 强大的非线性建模能力")
demonstrate_nn_power()
⚠️ 神经网络的注意事项
✅ 优点
def nn_advantages():
"""神经网络的优势"""
advantages = [
"💪 强大的非线性建模能力:能学习复杂的模式和关系",
"🔄 端到端学习:直接从原始数据学习,不需要手工设计特征",
"📚 迁移学习:预训练模型可以快速适应新任务",
"🎯 泛化能力强:在大数据集上表现优异",
"🌐 并行处理:适合GPU加速,训练大规模模型"
]
print("=== 神经网络的优势 ===")
for adv in advantages:
print(f"✅ {adv}")
nn_advantages()
❌ 缺点和挑战
def nn_challenges():
"""神经网络的挑战"""
challenges = [
"🕳️ 黑盒性质:很难解释网络内部的决策过程",
"📊 需要大量数据:小数据集容易过拟合",
"💻 计算资源密集:训练大型网络需要强大硬件",
"⚙️ 超参数调优复杂:层数、神经元数、学习率等需要精心调节",
"🎲 训练不稳定:可能陷入局部最优或梯度消失/爆炸",
"⏰ 训练时间长:复杂网络可能需要数天甚至数周"
]
print("=== 神经网络的挑战 ===")
for challenge in challenges:
print(f"⚠️ {challenge}")
print(f"\n应对策略:")
print(f"• 使用预训练模型减少训练成本")
print(f"• 采用正则化技术防止过拟合")
print(f"• 使用GPU/TPU加速训练")
print(f"• 运用自动化机器学习(AutoML)辅助调参")
nn_challenges()
📝 本篇小结
- 神经网络模仿大脑:由大量相互连接的神经元组成
- 单层感知机有局限:只能解决线性可分问题,无法解决XOR
- 多层网络突破限制:隐藏层引入非线性,能解决复杂问题
- 核心组件:
- 激活函数:注入非线性(ReLU最流行)
- 损失函数:衡量预测好坏(分类用交叉熵)
- 反向传播:网络学习的核心机制
- 强大能力:图像识别、语言理解、游戏AI、创意生成
- 挑战:黑盒性质、需要大数据、计算密集、调参复杂
🎯 练习题
- 手工计算:给定简单的2→3→1网络,手工计算前向传播的加权和
- 激活函数实验:尝试用不同激活函数训练同一个问题,观察效果差异
- 网络设计:为一个实际问题(如手写数字识别)设计合适的网络结构
- 可视化学习:观察网络权重在训练过程中的变化
- 对比实验:比较神经网络与之前学过的算法在同一问题上的表现
🔮 下一篇预告
第8篇:反向传播——神经网络是怎么学习的
我们刚刚见识了神经网络的强大,但有个关键问题还没深入解释:
神经网络到底是怎么从错误中学习的?
反向传播算法就像是网络的"老师":
- 当网络犯错时,它能精确地知道每个连接应该承担多少"责任"
- 然后微调每个连接的权重,让下次犯同样的错误少一点
- 经过成千上万次这样的调整,网络就"学会"了!
我们将深入数学细节,用最直观的方式理解这个让AI获得智能的核心算法!准备好揭开神经网络学习之谜了吗? 🧠✨

975

被折叠的 条评论
为什么被折叠?



