LiveTalking

Cuda download

https://developer.nvidia.com/cuda-downloads https://developer.download.nvidia.com/compute/cuda/12.6.0/network_installers/cuda_12.6.0_windows_network.exe

Anaconda download

https://anaconda.com/app/ https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/

https://blog.csdn.net/beautifulmemory/article/details/151933889

Project Download

git clone https://gitee.com/lipku/LiveTalking.git

不用翻墙

Config conda

conda config –remove-key channels conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch3d conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/peterjc123 conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config –add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config –set show_channel_urls yes conda clean -i conda create -n ltalk python=3.10

Pytorch Download

https://pytorch.org/get-started/locally/ pip3 install torch torchvision –index-url https://download.pytorch.org/whl/cu126 https://pytorch.org/get-started/previous-versions/ pip install torch==2.9.1 torchvision==0.24.1 torchaudio==2.9.1 –index-url https://download.pytorch.org/whl/cu126

conda install cudatoolkit

pip install -r requirements.txt

夸克云盘https://pan.quark.cn/s/83a750323ef0 GoogleDriver https://drive.google.com/drive/folders/1FOC_MD6wdogyyX_7V1d4NDIO7P9NlSAJ?usp=sharing 将wav2lip256.pth拷到本项目的models下, 重命名为wav2lip.pth; 将wav2lip256_avatar1.tar.gz解压后整个文件夹拷到本项目的data/avatars下

运行 python app.py –transport webrtc –model wav2lip –avatar_id wav2lip256_avatar1

CBOW

场景设定


第一轮下注

线索词:
1
+
1
苹果

押的钱
25
25
25
苹果 25

💡 初始完全随机,没有任何经验

目标词反馈:
1

调整经验表


第二轮下注

线索词:
1
+
1
苹果

押的钱
20
20
35
苹果 25

调整经验表

调整后押的钱
17
18
45
苹果 20

第三轮下注

线索词:
1
+
1
苹果

押的钱
17
18
45
苹果 20

调整后:

押的钱
15
17
50
苹果 18

第四轮下注

线索词:
1
+
1
苹果

押的钱
15
17
50
苹果 18

调整后:

押的钱
14
16
53
苹果 17

第五轮下注

线索词:
1
+
1
苹果

押的钱
14
16
53
苹果 17

调整后:

押的钱
13
15
55
苹果 16

✅ 总结这个多轮下注示例

  1. 每一轮都是:
    1. 线索词 → 综合感觉 → 查经验表 → 分钱
    2. 裁判反馈 → 调整经验表
  2. 经验表慢慢形成:
    • 对特定上下文组合 → “吃”的押注越来越高
    • 但不会到 100,因为其它场景可能需要不同押法
  3. 通过多轮、不同线索组合的练习,模型(你脑里的下注系统)逐渐学会在各种上下文下押最合理的钱

如果你愿意,我可以帮你画一个多轮下注流程图,让这个循环可视化,用颜色和箭头表示押钱增加/减少的变化,这样你可以完全在脑子里看到 CBOW 的动态训练过程。

你想让我画吗?

训练简单AI模型

好的,我帮你把我们从头到尾的讨论整理成一个完整、连贯的总结,方便你整理和分享给朋友。为了便于理解,我按逻辑顺序 + 分步骤 + 表格示例来汇总。


从零理解 AI 模型训练(完全用表格也能演示)

一、模型训练的本质

模型训练 = 用数据,不断调整参数,让模型犯错越来越少

核心流程:

  1. 做一次预测
  2. 计算预测错误(Loss)
  3. 调整参数,让下次预测更准

任何 AI 模型(线性回归、神经网络、深度学习)本质都是这个过程。


二、把模型理解成可调公式

以最简单的线性回归为例:

[ \hat y = w \cdot x + b ]

训练模型的目的:

找到一组 w 和 b,使预测值 (\hat y) 与真实值 y 的误差最小。


三、损失函数(Loss)


四、梯度与参数更新

  1. 梯度 = Loss 对参数的导数
    • 指明 Loss 上升最快的方向
  2. 梯度下降公式

[ \text{新参数} = \text{旧参数} - \text{学习率} \cdot \text{梯度} ]

直观理解:在“山谷里找最低点”


五、随机性在训练中的作用

来源 作用
参数初始化随机 打破对称,使神经元学到不同特征
数据顺序随机 防止模型只记顺序,提高泛化
优化算法噪声 稳定训练,跳出局部最优

随机 ≠ 瞎试,它只是“起点不同”,实际每一步计算都是确定性的。


六、用表格理解训练过程(手算)

示例数据

x(学习小时) y(真实成绩)
1 55
2 58
3 65
4 70
5 78

模型公式

[ \hat y = w \cdot x + b ]


Step 1:初始化参数(随机)

参数 数值
w 5.0
b 50

Step 2:预测值

x y 预测 ŷ = w×x+b
1 55 55
2 58 60
3 65 65
4 70 70
5 78 75

Step 3:计算误差和 Loss(MSE)

x y ŷ 误差 (ŷ−y) 误差²
1 55 55 0 0
2 58 60 2 4
3 65 65 0 0
4 70 70 0 0
5 78 75 -3 9

[ \text{MSE} = \frac{0+4+0+0+9}{5} = 2.6 ]


Step 4:判断梯度方向(手动)

w Loss
4.9 3.15
5.0 2.6
5.1 2.27

这就是“梯度下降”的原理:看 Loss 上升/下降方向来调参数。


Step 5:迭代更新参数


七、公式求解最优 w 和 b(最小二乘法)

1️⃣ 公式

[ w = \frac{\sum (x_i - \bar x)(y_i - \bar y)}{\sum (x_i - \bar x)^2} ]

[ b = \bar y - w \cdot \bar x ]

2️⃣ 计算

[ w = 58 / 10 = 5.8 ]

[ b = 65.2 - 5.8 * 3 = 47.8 ]

3️⃣ 最优模型

[ \hat y = 5.8 x + 47.8 ]


预测示例

x y 预测 ŷ
1 55 53.6
2 58 59.4
3 65 65.2
4 70 71.0
5 78 76.8

整体误差更小,Loss 下降。


八、总结训练原理

  1. 模型 = 可调公式
  2. 训练 = 找参数让 Loss 最小
  3. 梯度下降 = 按数学规则一步步逼近最优解
  4. 随机性只影响起点或训练稳定性,不影响最终目标
  5. 手算表格 = 最直观理解梯度和 Loss 的方式

九、表格练习建议


十、结论

只用表格,也能完全理解 AI 模型训练原理

  1. 模型公式
  2. 预测与误差
  3. Loss 计算
  4. 梯度方向
  5. 参数更新
  6. 收敛到最优参数

这一套流程,完全对应任何 AI 框架(sklearn / PyTorch / TensorFlow)背后的逻辑。


如果你想,我可以帮你做一个完整 Excel 表格模板, 直接输入数据就能模拟 一次完整的训练过程,连梯度下降都可视化。

你希望我帮你做这个模板吗?

Future

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
void futureStateDemo() async {
  print('=== Future的状态和缓存 ===');
  
  // 创建一个Future
  var future = Future.delayed(Duration(seconds: 2), () {
    print('Future计算完成');
    return 42;  // 计算结果
  });
  
  // 状态1: Uncompleted(未完成) - 0~2秒
  print('创建后立即检查:');
  print('  是否完成? ${future is Future<int>}'); // true,但还未计算
  print('  当前时间: ${DateTime.now()}');
  
  // 等3秒,让Future完成
  await Future.delayed(Duration(seconds: 3));
  
  // 状态2: Completed with value(已完成,有值) - 2秒后
  print('\n3秒后检查:');
  var value = await future;  // ⭐ 这里是从缓存取值!
  print('  取值: $value');
  print('  再次取值: ${await future}');  // 再次从缓存取
  
  // 状态3: Completed with error(已完成,有错误)
  var errorFuture = Future.error(Exception('测试错误'));
  try {
    await errorFuture;
  } catch (e) {
    print('\n错误Future: $e');
  }
  // 错误也被缓存!
  try {
    await errorFuture;  // 同样的错误
  } catch (e) {
    print('再次获取同样的错误: $e');
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void main() async {
  print('开始');
  
  // 并行启动所有Future
  var future1 = fetchData(1);  // 立即启动,不等待
  var future2 = fetchData(2);  // 立即启动,不等待  
  var future3 = fetchData(3);  // 立即启动,不等待
  
  var time = DateTime.now();

  // 等待所有Future完成
  var data1 = await future1;
  var data2 = await future2;
  var data3 = await future3;
  
  print('结果: $data1, $data2, $data3');
  print('总耗时: ${(DateTime.now()).difference(time).inSeconds}秒');
}

Future<String> fetchData(int index) {
  print('开始获取数据$index, 当前时间: ${DateTime.now()}');
  return Future.delayed(Duration(seconds: 10), () {
    // 模拟网络请求
    return '从服务器获取的数据$index';
    // 抛出异常模拟错误
    // throw Exception('网络错误');
  });
}

输出结果:

1
2
3
4
5
6
7
8
开始
开始获取数据1, 当前时间: 2025-12-03 20:30:52.643714
开始获取数据2, 当前时间: 2025-12-03 20:30:52.655745
开始获取数据3, 当前时间: 2025-12-03 20:30:52.656121
结果: 从服务器获取的数据1, 从服务器获取的数据2, 从服务器获取的数据3
总耗时: 10秒

Exited.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void main() async {
  print('1. main开始');
  
  // 这3个Future立即进入"微任务队列"
  var future1 = fetchData(1);
  var future2 = fetchData(2);
  var future3 = fetchData(3);
  
  print('2. Future已创建,但未等待');
  
  // 没有await,main函数继续执行
  print('3. main继续执行');
  
  // main函数结束,但程序不会立即退出
  // 因为还有未完成的Future
  print('4. main结束');
  
  // 注意:即使main函数结束,Future仍在后台执行
  // 但程序会等待所有未完成的Future吗?看下面的测试
}

Future<String> fetchData(int index) {
  print('开始获取数据$index');
  return Future.delayed(Duration(seconds: 2), () {
    print('数据$index完成');  // 这个还会执行吗?
    return '数据$index';
  });
}

输出结果:

1
2
3
4
5
6
7
8
9
10
11
12
1. main开始
开始获取数据1
开始获取数据2
开始获取数据3
2. Future已创建,但未等待
3. main继续执行
4. main结束
数据1完成
数据2完成
数据3完成

Exited.

近期文章

相关页面