上一篇我们掌握了变量、数据类型和运算符这些 “基础积木”,今天要学的流程控制语句,就是把这些积木搭成 “可执行的大模型训练逻辑” 的核心 —— 比如 “损失值低于 0.1 就停止训练”“循环读取 100 轮训练数据”“根据不同数据集选择不同学习率”,全靠 if、for、while 这三类语句实现,搞定它,你就能写出有 “逻辑” 的大模型代码了!条件判断就像大模型训练中的 “裁判”,根据设定的条件(比如损失值、准确率)决定下一步该做什么,是开发中最常用的流程控制语句。
1. 基本语法:单条件判断
大模型场景示例:判断模型是否达标
# 模拟大模型训练后的准确率accuracy = 0.88# 设定达标阈值:准确率≥0.85则达标if accuracy >= 0.85: print(f"模型达标!准确率:{accuracy}") # 缩进4个空格/1个Tab,是Python的核心语法
运行结果:模型达标!准确率:0.88
if 条件: 满足条件执行的代码else: 不满足条件执行的代码
# 模拟大模型当前损失值loss = 0.12# 设定停止条件:损失值≤0.1则停止训练if loss <= 0.1: print(f"损失值{loss}达标,停止训练!")else: print(f"损失值{loss}未达标,继续训练~")
3. 多条件判断(if-elif-else):多场景决策if 条件1: 执行代码1elif 条件2: 执行代码2...else: 以上条件都不满足时执行
# 模拟大模型准确率accuracy = 0.75# 初始化学习率learning_rate = 0.001# 根据准确率分档调整学习率if accuracy >= 0.85: learning_rate *= 0.8 # 准确率高,降低学习率防止过拟合elif accuracy >= 0.75: learning_rate *= 0.9 # 准确率中等,小幅降低学习率else: learning_rate *= 1.1 # 准确率低,提高学习率加速收敛print(f"调整后学习率:{learning_rate}")
大模型场景示例:判断训练是否继续 + 是否保存模型# 模拟模型指标loss = 0.09accuracy = 0.87# 第一层判断:损失值是否达标if loss <= 0.1: print("损失值达标!") # 第二层判断:准确率是否达标(嵌套缩进) if accuracy >= 0.85: print("准确率也达标,保存模型并停止训练~") else: print("准确率未达标,仅停止训练,不保存模型!")else: print("损失值未达标,继续训练~")
运行结果:
二、循环语句(for):大模型训练的 “重复器”
大模型训练需要重复执行相同的逻辑(比如读取 100 轮数据、计算 1000 次损失值),for 循环就是用来实现 “固定次数的重复操作”,是处理批量数据的核心。1. 基本语法:遍历序列(列表 / 字典 / 范围)用 range(起始值, 结束值, 步长) 生成数字序列,大模型训练轮数常用:
# 模拟大模型训练10轮(range(10) 生成0-9的数字)for epoch in range(10): # 模拟每轮训练的损失值(逐轮降低) loss = 0.2 - epoch * 0.02 print(f"第{epoch+1}轮训练,损失值:{loss:.2f}")
第1轮训练,损失值:0.20第2轮训练,损失值:0.18...第10轮训练,损失值:0.02
# 存储大模型8轮训练的损失值loss_list = [0.32, 0.28, 0.25, 0.22, 0.19, 0.17, 0.15, 0.13]total_loss = 0 # 初始化总损失值# 遍历损失列表,累加总损失for loss in loss_list: total_loss += loss# 计算平均损失avg_loss = total_loss / len(loss_list)print(f"8轮训练总损失:{total_loss:.2f},平均损失:{avg_loss:.2f}")
运行结果:8轮训练总损失:1.71,平均损失:0.21# 大模型配置字典llm_config = { "model_name": "Python-LLM-Base", "learning_rate": 0.0005, "batch_size": 64, "train_epochs": 100}# 遍历字典,打印每个配置项for key, value in llm_config.items(): print(f"配置项 {key}:{value}")
运行结果:
配置项 model_name:Python-LLM-Base配置项 learning_rate:0.0005配置项 batch_size:64配置项 train_epochs:100
5. 循环控制:break/continue(灵活调整训练逻辑)break:立即终止循环(比如训练达标后提前停止);continue:跳过当前轮次,执行下一轮(比如跳过无效数据)。
# 模拟训练20轮,若损失值≤0.1则提前停止for epoch in range(20): loss = 0.2 - epoch * 0.015 # 模拟损失值逐轮降低 print(f"第{epoch+1}轮训练,损失值:{loss:.2f}") # 条件判断:损失值≤0.1则停止训练 if loss <= 0.1: print(f"第{epoch+1}轮损失值达标,提前停止训练!") break # 终止循环
运行结果:
第1轮训练,损失值:0.20第2轮训练,损失值:0.18第3轮训练,损失值:0.17第4轮训练,损失值:0.15第5轮训练,损失值:0.14第6轮训练,损失值:0.12第7轮训练,损失值:0.11第8轮训练,损失值:0.09第8轮损失值达标,提前停止训练!
三、循环语句(while):大模型训练的 “无限重复器”while 循环是 “条件满足就一直执行”,适合不确定循环次数的场景(比如直到模型收敛才停止训练)。
1. 基本语法
2. 核心用法:直到模型收敛才停止训练
# 初始化参数current_loss = 0.25 # 初始损失值epoch = 0 # 训练轮数lr = 0.001 # 学习率# 循环训练:损失值>0.1就继续while current_loss > 0.1: epoch += 1 # 模拟训练:每轮损失值降低(学习率越高,降得越快) current_loss -= lr * 10 # 防止损失值为负数(边界处理) current_loss = max(current_loss, 0.0) print(f"第{epoch}轮训练,当前损失值:{current_loss:.2f}")print(f"\n训练完成!共训练{epoch}轮,最终损失值:{current_loss:.2f}")
第1轮训练,当前损失值:0.24第2轮训练,当前损失值:0.23...第15轮训练,当前损失值:0.10训练完成!共训练15轮,最终损失值:0.10
while 循环如果条件永远满足,会一直执行(死循环),开发时一定要确保条件能 “不满足”:❌ 错误示例:while True: print("训练中...")(无终止条件)current_loss = 0.25epoch = 0max_epochs = 50 # 最大训练轮数while current_loss > 0.1 and epoch < max_epochs: epoch += 1 current_loss -= 0.01 print(f"第{epoch}轮,损失值:{current_loss:.2f}")
"""实战案例:大模型基础训练逻辑功能:1. 定义模型初始参数2. 循环训练,每轮打印损失值3. 满足以下任一条件则停止训练: - 损失值≤0.1 - 训练轮数≥304. 训练结束后输出总结"""# 1. 初始化模型参数llm_config = { "learning_rate": 0.001, "max_epochs": 30, "target_loss": 0.1}current_loss = 0.3 # 初始损失值train_epochs = 0 # 已训练轮数loss_history = [] # 存储每轮损失值(方便后续分析)# 2. 开始训练(while循环)print("===== 大模型训练开始 =====")while current_loss > llm_config["target_loss"] and train_epochs < llm_config["max_epochs"]: train_epochs += 1 # 模拟每轮训练:损失值降低(受学习率影响) current_loss -= llm_config["learning_rate"] * 8 current_loss = max(current_loss, 0.0) # 防止损失值为负 loss_history.append(current_loss) # 记录损失值 # 每5轮打印一次进度(条件判断+取余运算) if train_epochs % 5 == 0: print(f"第{train_epochs}轮训练,当前损失值:{current_loss:.2f}")# 3. 训练结束,输出总结(多条件判断)print("\n===== 训练总结 =====")if current_loss <= llm_config["target_loss"]: print(f"✅ 训练达标!损失值{current_loss:.2f} ≤ 目标值{llm_config['target_loss']}")elif train_epochs >= llm_config["max_epochs"]: print(f"⚠️ 训练达到最大轮数{llm_config['max_epochs']},未达标(当前损失:{current_loss:.2f})")print(f"总训练轮数:{train_epochs}")print(f"损失值变化:{loss_history[:3]}...{loss_history[-3:]}") # 打印前3和后3轮损失值
运行结果:
===== 大模型训练开始 =====第5轮训练,当前损失值:0.26第10轮训练,当前损失值:0.22第15轮训练,当前损失值:0.18第20轮训练,当前损失值:0.14第25轮训练,当前损失值:0.10===== 训练总结 =====✅ 训练达标!损失值0.10 ≤ 目标值0.1总训练轮数:25损失值变化:[0.292, 0.284, 0.276]...[0.108, 0.10000000000000009, 0.09200000000000008]
总结
- if 条件判断是大模型训练的 “决策器”,单条件用 if、二选一用 if-else、多场景用 if-elif-else,嵌套判断可处理复杂逻辑;
- for 循环适合 “固定次数” 的重复操作(比如多轮训练、遍历数据),break 终止循环、continue 跳过当前轮次;
- while 循环适合 “不确定次数” 的重复操作(比如直到模型收敛),务必设置终止条件避免死循环。
下一篇预告
今天我们掌握了流程控制的核心 ——if 判断做决策、for/while 循环做重复操作,这是编写大模型训练逻辑的 “骨架”。下一篇将讲解函数:把重复的训练逻辑(比如计算损失值、调整学习率)封装成函数,让代码更简洁、可复用,这是大模型项目模块化开发的关键!
如果写代码时遇到问题,评论区贴出你的代码和报错信息,觉得干货有用,点赞 + 在看 + 转发,让更多想入门大模型的朋友一起学!