强化学习中的探索与利用:从 ε-greedy 到 UCB
智能体总选当前回报最高的动作,可能永远错过真正更好的选择;如果一直尝试未知动作,又会浪费已经学到的信息。探索与利用的矛盾,就是在“获取信息”和“使用信息”之间分配有限交互次数。
多臂老虎机去掉了完整强化学习中的状态转移和延迟回报,保留这组矛盾的最小形式。它很适合用来理解探索策略,因为每种方法为什么有效、又会在哪里失效,都能被直接观察。
1. 多臂老虎机模型设有 k 个动作。每次选择动作 a,环境从该动作未知的奖励分布中给出奖励。动作的真实期望奖励记为 q*(a),智能体只能维护估计值 Q_t(a)。
若动作 a 已被选择 N_t(a) 次,新奖励为 R_t,样本均值可以增量更新:
1Q_{t+1}(a) = Q_t(a) + 1 / N_t(a) × [R_t - Q_t(a)]
括号中的差叫估计误差。这个公式不必保存全部历史奖励,每一步只需维护次数和当前均值。
除了平均奖励,还可以考察累积遗憾:每一步没有选择真实最优动作时,损失了多少期望奖励。
1Regret(T) = Σ(q*(a*) - q*(A_t)), t = 1 ... T
真实任务里通常不知 ...
古典音乐曲式入门:从乐句到回旋与奏鸣
曲式不是贴在作品上的字母标签,而是音乐管理记忆与期待的方式。当熟悉的主题回来,我们会感到确认;当它迟迟不回来,注意力会被悬在半空;当旧材料在陌生调性里出现,我们同时听见“相似”与“变化”。
本文从耳朵能够直接感受到的乐句和终止出发,逐步走到二部、三部、回旋、变奏与奏鸣曲式。目标不是在第一次聆听时画出完美分析图,而是能描述自己听见了怎样的离开、对比和返回。
1. 先听层级,不急着背字母音乐结构往往像语言一样逐层组合:
flowchart LR
A[动机<br>短小可辨认材料] --> B[乐句<br>一次呼吸或方向]
B --> C[乐段<br>若干乐句形成局部完整]
C --> D[大型段落<br>呈示、发展、再现等功能]
D --> E[乐章<br>完整时间布局]
层级不是由固定秒数决定的。四个音可以成为动机,一段旋律可以成为乐句,而多个乐句通过终止、重复和对比组成更大的段落。听结构时,先留意三个信号:
重复:熟悉材料原样或变化后再次出现;
对比:音 ...
Codeforces 贪心三题:排序、交换论证与局部最优
贪心算法最容易写出,也最容易写错。它通常只保留当前局面,然后做一个看起来最划算的选择;真正的难点不是代码,而是证明这个局部选择不会破坏全局最优解。
本文选择三道难度逐步上升的 Codeforces 题:先用排序决定拿硬币的顺序,再证明挑战巨龙的唯一安全次序,最后用“给未来留下空间”的原则决定树向哪边倒。
1. 判断一道题能否贪心看到“最少、最多、任意顺序”时,可以先提出三个问题:
当前选择之后,未来需要保留哪些信息?
如果最优方案没有采用我的选择,能否交换成采用它而不变差?
做出选择后,剩余问题是否仍是同一类问题?
flowchart LR
A[候选选择] --> B{能否交换而不变差}
B -->|能| C[证明贪心选择性质]
B -->|不能确定| D[寻找反例或改用 DP]
C --> E{剩余问题结构不变}
E -->|是| F[逐步执行局部最优]
E -->|否| D
排序经常出现在贪心题里,但“排序后做”本身不是证明。需要解释排序改变了什么,以及为什么另一种次序不可能更 ...
强化学习入门:从 MDP、价值函数到 Q-learning
监督学习从带标签的样本中学习映射,强化学习则面对一个会被行动改变的环境:智能体做出选择,环境进入新状态并给出奖励,之后的选择又会受到前面结果影响。
真正困难的地方不是“怎样获得一次高奖励”,而是怎样处理延迟回报、探索未知行动,并从带噪声的交互中学到长期有效的策略。本文先建立最小概念框架,再用一个不依赖第三方库的 Q-learning 示例把公式落到代码。
1. 强化学习在解决什么问题强化学习的核心是一个循环:
flowchart LR
A[智能体 Agent] -->|选择动作 aₜ| B[环境 Environment]
B -->|观察 sₜ₊₁ 与奖励 rₜ₊₁| A
A --> C[更新策略或价值估计]
C --> A
在时刻 t,智能体观察状态 s_t,根据策略选择动作 a_t。环境随后返回奖励 r_{t+1} 和下一状态 s_{t+1}。智能体的目标不是让当前奖励最大,而是让一段交互中的累计回报尽可能大。
典型任务包括:
游戏中根据局面连续选择动作;
机器人根据 ...
Codeforces 前缀和与差分四题:区间查询、覆盖与双层离线
当许多查询反复询问同一个数组的区间信息时,逐次扫描通常浪费了大量重复计算。前缀和把“多次查询”变成一次预处理,差分则把“多次区间修改”延迟到最后统一还原。
本文选择四道 Codeforces 题,从一维前缀计数开始,走到差分覆盖与排序贪心,最后用双层差分处理“查询作用于操作、操作再作用于数组”的结构。重点是看清信息流向:题目是在反复读取区间,还是反复影响区间?
1. 前缀和与差分是一对逆操作设原数组为 a,前缀数组 prefix 记录从开头到当前位置的累计值:
1prefix[i] = a[1] + a[2] + ... + a[i]
那么区间 [l, r] 的和可以用两个前缀相减:
1sum(l, r) = prefix[r] - prefix[l - 1]
差分数组则记录相邻位置的变化。想给整个区间 [l, r] 增加 value,只需要:
12difference[l] += valuedifference[r + 1] -= value
最后对差分数组求一次前缀和,就能恢复每个位置受到的总影响。
flowchart LR
A[原数组] -- 累加 ...
古典音乐中的和声张力:从功能和声到终止式
旋律告诉我们“谁在说话”,和声则常常决定一句话是否已经说完。即使不知道和弦名称,我们也能听见某些时刻像站稳、像离开、像等待,或者像终于回到原点。这种方向感,是理解功能和声最自然的入口。
本文不把和声简化成“某个和弦等于某种情绪”,而是把它看成时间中的作用关系:同一个和弦放在不同调性、音区、节拍和上下文里,意义都可能改变。
1. 和声张力不是音量音乐变紧张,不一定要更响、更快或使用更多乐器。一个很轻的和弦也可能因为迟迟不解决而充满悬念;一段厚重的全奏也可能已经稳定地落在终点。
判断和声张力时,可以先问三个问题:
当前声音是否让人愿意停住;
它是否像在推动下一步;
下一和弦出现后,之前的期待有没有得到满足。
所以张力不是单个和弦的固定属性,而是前后关系产生的听觉预期。
2. 三类基本功能在大、小调功能和声中,常用三个功能区域描述方向。罗马数字表示和弦建立在调式的第几级上,并不是另一套音名。
功能区域
常见级数
听觉作用
可以想象成
主功能 Tonic
I,有时包含 vi、iii
确立或延长稳定中心
家与地面
下属/前属功能 Predominant
IV、i ...
Codeforces 序列优化四题:滑动窗口、双指针与二分查找
很多序列题看起来都在“枚举一段区间”,但区间的性质不同,最合适的工具也不同:长度固定时维护窗口和,约束单调时移动左右边界,查询阈值时在有序数据上二分。
本文选择四道 Codeforces 官方题目,把它们放在同一条学习路径上。新增的 580B 会把“先排序”和“双指针”组合起来,重点仍不是记住代码,而是学会通过题目结构选择数据移动方式。
1. 先判断区间属于哪一种模型
flowchart TD
A[题目要求处理连续区间] --> B{区间长度固定吗}
B -- 是 --> C[固定滑动窗口]
B -- 否 --> D{加入元素后代价单调增加吗}
D -- 是 --> E[双指针维护可行窗口]
D -- 否 --> F[考虑前缀和、二分或其他结构]
A --> G{是独立阈值查询吗}
G -- 是 --> H[排序后 upper_bound]
三种方法都在避免重复工作:窗口复用上一次的和,双指针保证边界只向前移动,二分则利用有序性排除一半范围。
2. 363B Fence:固 ...
Codeforces 入门五题:把题意翻译成判断、计数与模拟
刚开始做算法题时,最困难的部分往往不是语法,而是把一段自然语言压缩成几个明确条件。Codeforces 的 800 分题很适合训练这项能力:代码通常不长,错误却能准确暴露题意理解、下标和边界处理上的问题。
本文选择五道官方入门题,不复述完整题面,而是专注于“怎样从要求得到判断式”。前四题练习直接翻译,第五题再向前走一步:既要给出答案,也要解释为什么它一定最优。
1. 通用翻译流程面对一道短题,可以先写出四行草稿:输入是什么、输出是什么、每个条件怎样判断、最小边界在哪里。
flowchart LR
A[阅读输入与输出] --> B[圈出必须满足的条件]
B --> C[把条件写成布尔表达式]
C --> D[用最小值和临界值测试]
D --> E[再开始编码]
不要急着寻找“算法名称”。如果题目只需要扫描、计数或判断,直接实现就是正确算法。
2. 4A Watermelon:必要条件与充分条件官方题目:4A Watermelon · 难度 800 · 官方标签:math、brute force
核心要求把一个整数重 ...
个人知识地图:用分类、标签与链接组织长期写作
文章数量增加以后,博客很容易变成一个按时间倒序排列的文件柜。旧文章并没有消失,却越来越难被再次发现;新文章也常常重复解释以前写过的背景。
解决这个问题不需要一开始设计庞大的知识体系。只要让分类、标签和文章链接各自承担清晰职责,博客就会从时间线逐步长成一张能够探索的知识地图。
知识地图不是一次规划完成的目录,而是内容在持续连接中显露出的地形。
1. 三种结构不要混在一起分类、标签和链接看起来都在做整理,但它们回答的是不同问题。
结构
回答的问题
合适的数量
典型例子
分类
这篇文章主要属于哪个长期方向
少而稳定
AI 工程、数据分析、音乐随笔
标签
它涉及哪些可以横向交叉的概念
适度增长
RAG、可观测性、聆听指南
链接
阅读前后还需要哪些具体上下文
随内容自然增加
搭建文章连接到评测文章
一个简单原则是:分类像书架,标签像索引,链接像路。书架频繁改变会让人迷路,索引过多会失去区分度,没有路则会让每篇文章成为孤岛。
2. 分类负责长期承诺好的分类通常对应愿意持续写几年的主题,而不是某次短期兴趣。判断一个名称是否适合作为分类,可以问三个问题:
...
古典音乐中的主题变形:四个音怎样长成一首曲子
一首规模很大的作品,常常不是由无数互不相关的旋律堆起来的。作曲家更像是在观察一颗种子:改变它的速度、重音、方向、光线和生长环境,让一个短小动机在不同场景中继续保持身份。
理解主题变形之后,听音乐会多出一条线索:我们不再只等待“熟悉的旋律回来”,而是开始辨认它换了怎样的步伐和语气。
一个短小动机可以沿着节奏、和声与配器,逐渐展开成完整的声音世界。
1. 主题与动机有什么区别动机通常很短,可能只有几个音,最重要的是它有容易辨认的节奏或音程轮廓。主题则更完整,往往已经形成一句可以独立记住的音乐。
可以把它们理解成语言中的词根与句子:词根很小,却能在不同词语中保留意义;句子更完整,但依然可以拆回几个关键材料。
本文用一个抽象的四音动机来说明:先上行,再稍作停顿,最后回落。无需知道具体音名,只要记住它的“动作”。
2. 发展、变奏与主题变形有什么不同这三个词都涉及“材料发生变化”,但观察尺度不同。
概念
常见组织方式
聆听时先问
动机发展
把短材料切分、模进、倒置或重组,推动当前段落
这个碎片怎样制造方向?
变奏
一个相对完整的主题之后出现若干可分辨的变体
每 ...