<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>无序</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://boywuxu.github.io/</id>
  <link href="https://boywuxu.github.io/" rel="alternate"/>
  <link href="https://boywuxu.github.io/rss.xml" rel="self"/>
  <rights>All rights reserved 2026, 无序</rights>
  <subtitle>researcher • LLM Algorithm Engineer</subtitle>
  <title>无序的个人博客</title>
  <updated>2026-04-22T16:24:26.892Z</updated>
  <entry>
    <author>
      <name>无序</name>
    </author>
    <content>
      <![CDATA[<h1 id="每日计划"><a href="#每日计划" class="headerlink" title="每日计划"></a>每日计划</h1><h2 id="每天"><a href="#每天" class="headerlink" title="每天"></a>每天</h2><blockquote><p>原则：<strong>保护每天最清醒的 2 小时</strong>，其余时间才是公司的</p></blockquote><h3 id="时间分配模板（10-10-5-节奏下）"><a href="#时间分配模板（10-10-5-节奏下）" class="headerlink" title="时间分配模板（10-10-5 节奏下）"></a>时间分配模板（10-10-5 节奏下）</h3><ul><li><p><strong>早上到公司后的第一个小时（约 10:00–11:00）</strong></p><blockquote><p>深度时间，不开会不看消息。做当天最难的一件事：读一篇论文、写技术分析、死磕一个没想通的问题。这是全天精力最高点。</p></blockquote></li><li><p><strong>11:00–18:00</strong></p><blockquote><p>正常工作节奏：需求开发、会议、code review、和同学协作。这段时间属于团队。</p></blockquote></li><li><p><strong>晚饭后 1 小时（约 19:00–20:00）</strong></p><blockquote><p>第二个深度窗口。整理当天的技术笔记，或者推进当周的”一篇文章”。不强求每天都有，但有就用好。</p></blockquote></li><li><p><strong>每天睡前 10 分钟</strong></p><blockquote><p>在笔记本上写一句话：今天学到&#x2F;想清楚了什么？哪怕一个小细节也算。365天下来是一本真实的成长日志。</p></blockquote></li></ul><blockquote><p>⚠️ <strong>最容易破功的时刻</strong>：早上一到公司就打开微信&#x2F;飞书刷消息。消息会吃掉你最清醒的一小时，而且大多数消息并不紧急。</p></blockquote><hr><h2 id="每周"><a href="#每周" class="headerlink" title="每周"></a>每周</h2><blockquote><p>原则：<strong>每周必须有一件事是”比上周更深”的</strong></p></blockquote><h3 id="固定动作清单"><a href="#固定动作清单" class="headerlink" title="固定动作清单"></a>固定动作清单</h3><ul><li><p><strong>周一：确定本周的”一个深度问题”</strong></p><blockquote><p>不是任务列表，是一个还没想清楚的技术问题。例如：”为什么我们的 rerank 模型在长 query 下表现差？”这周就围绕这一个问题挖。</p></blockquote></li><li><p><strong>周三：读完一篇相关论文或技术博客</strong></p><blockquote><p>不是泛读，是精读——读完能用自己的话复述核心贡献和局限性。推荐来源：ACL&#x2F;EMNLP&#x2F;SIGIR、字节&#x2F;阿里&#x2F;腾讯技术博客、Hugging Face Blog。</p></blockquote></li><li><p><strong>周五：写 200–400 字的技术笔记</strong></p><blockquote><p>把这周想清楚的东西写下来。格式：问题是什么 → 我之前的理解 → 现在的新理解 → 还没想清楚的地方。不需要完美，只需要真实。</p></blockquote></li><li><p><strong>周末（任选半天）：一件溢出字节的事</strong></p><blockquote><p>推进当月文章的写作、在技术社群里回答一个问题、看一个外部技术演讲、和一个行业里的人聊 30 分钟。二选一做到就行，不强求全做。</p></blockquote></li></ul><h3 id="推荐论文来源"><a href="#推荐论文来源" class="headerlink" title="推荐论文来源"></a>推荐论文来源</h3><ul><li>ACL Anthology</li><li>arXiv cs.CL &#x2F; cs.IR</li><li>Papers With Code</li><li>各大厂技术博客</li></ul><h3 id="笔记工具建议"><a href="#笔记工具建议" class="headerlink" title="笔记工具建议"></a>笔记工具建议</h3><ul><li>Obsidian（本地，可搜索）</li><li>或 Notion（云端协作）</li><li>核心：能按主题聚合，能全文搜索</li></ul><hr><h2 id="每月"><a href="#每月" class="headerlink" title="每月"></a>每月</h2><blockquote><p>原则：<strong>每月一篇对外输出，让外部世界知道你在想什么</strong></p></blockquote><h3 id="每月必做的三件事"><a href="#每月必做的三件事" class="headerlink" title="每月必做的三件事"></a>每月必做的三件事</h3><ol><li><p><strong>发表一篇技术文章（核心动作）</strong></p><blockquote><p>不需要宏大，选一个你这个月真正搞清楚的具体问题。</p><p>好题目模板：</p><ul><li>“我们在XXX场景下做RAG的三个踩坑经验”</li><li>“为什么LLM-as-Judge在电商客服里不能直接用”</li><li>“对话系统意图识别：从规则到大模型的演进”</li></ul><p>发布平台：知乎 + 公众号同步发，知乎做搜索流量，公众号做沉淀。</p></blockquote></li><li><p><strong>做一次”外部校准”</strong></p><blockquote><p>和一个不在字节的人聊你正在做的技术方向，听听他们的视角。可以是前同学、行业群里认识的人、或者文章评论区来互动的人。目的不是找工作，是防止信息茧房。</p></blockquote></li><li><p><strong>回顾当月的”深度问题笔记”</strong></p><blockquote><p>把四周的笔记放在一起看，有没有可以串联起来的洞察？有没有某个问题反复出现、值得下个月专门深挖？月末花 30 分钟做这件事，比单独看每篇笔记价值高很多。</p></blockquote></li></ol><blockquote><p>⚠️ <strong>文章不要追求完美再发</strong>。”够好就发”比”完美再发”产生的复利多 10 倍——因为发出去才有反馈，有反馈才能校准。</p></blockquote><hr><h2 id="每季度"><a href="#每季度" class="headerlink" title="每季度"></a>每季度</h2><blockquote><p>原则：<strong>每季度一次诚实复盘，确保忙碌在转化成积累</strong></p></blockquote><h3 id="季度复盘模板（固定用这七个问题）"><a href="#季度复盘模板（固定用这七个问题）" class="headerlink" title="季度复盘模板（固定用这七个问题）"></a>季度复盘模板（固定用这七个问题）</h3><ol><li><p><strong>这季度我解决了什么之前解决不了的问题？</strong></p><blockquote><p>写具体的技术问题，不是”我学了很多”这种泛泛的话</p></blockquote></li><li><p><strong>我的主线方向有没有往前推进？推进了多少？</strong></p><blockquote><p>对照上季度定的”一个深度问题”，现在想清楚了吗？</p></blockquote></li><li><p><strong>我这季度输出了什么？被外部看到了吗？</strong></p><blockquote><p>文章数量、阅读量、有没有引发有价值的对话</p></blockquote></li><li><p><strong>我和哪些比我强的人产生了碰撞？</strong></p><blockquote><p>碰撞不是认识，是真正交流过技术观点</p></blockquote></li><li><p><strong>财务目标有没有按计划推进？</strong></p><blockquote><p>储蓄、投资、生活方式有没有膨胀</p></blockquote></li><li><p><strong>精力状态怎么样？有没有在透支？</strong></p><blockquote><p>可持续比短期冲刺更重要，5年是马拉松</p></blockquote></li><li><p><strong>下季度最重要的一件事是什么？</strong></p><blockquote><p>只允许写一件事，逼自己做取舍</p></blockquote></li></ol><h3 id="季度的”被检验”动作"><a href="#季度的”被检验”动作" class="headerlink" title="季度的”被检验”动作"></a>季度的”被检验”动作</h3><ul><li><strong>Q1 &#x2F; Q3</strong>：在技术社群做一次线上分享，或者提交一篇会议 paper &#x2F; workshop</li><li><strong>Q2 &#x2F; Q4</strong>：整理一篇比平时更深的长文，当作半年技术沉淀的总结</li></ul><hr><h2 id="每年"><a href="#每年" class="headerlink" title="每年"></a>每年</h2><blockquote><p>原则：<strong>每年做一件”让自己害怕但值得做”的事</strong></p></blockquote><h3 id="年度固定动作"><a href="#年度固定动作" class="headerlink" title="年度固定动作"></a>年度固定动作</h3><ol><li><p><strong>参加一次行业顶会（ACL &#x2F; EMNLP &#x2F; SIGIR 等）</strong></p><blockquote><p>哪怕只是听众，也要去。在走廊和茶歇时主动和做相似问题的人搭话。一次会议认识的 2–3 个人，比半年在办公室更有效。</p></blockquote></li><li><p><strong>做一次”完整技术梳理”</strong></p><blockquote><p>把你过去一年在主线方向上积累的所有笔记、项目、论文阅读，整理成一篇系统性的长文或内部技术报告。这个过程会让你看清楚自己真正掌握了什么，还有什么空洞。</p></blockquote></li><li><p><strong>做一次市场定价</strong></p><blockquote><p>和 1–2 个猎头聊，或者认真看一次外部 JD，了解你现在在市场上值多少。不是为了跳槽，是为了知道字节给你的定价是否公平，以及你的成长速度是否跟上了市场。</p></blockquote></li><li><p><strong>做一件”让自己害怕”的事</strong></p><blockquote><ul><li>第1年：在组内做技术分享</li><li>第2年：发第一篇对外文章</li><li>第3年：在会议上做 talk</li><li>第4年：主动找行业里最顶尖的人请教</li><li>第5年：公开表达一个有争议的技术观点</li></ul><p>每年推一次边界。</p></blockquote></li></ol><h3 id="年末问自己一个最重要的问题"><a href="#年末问自己一个最重要的问题" class="headerlink" title="年末问自己一个最重要的问题"></a>年末问自己一个最重要的问题</h3><p><strong>如果我今天离开字节，我能带走什么？</strong></p><blockquote><p>不是代码，不是人脉录，而是：你对某类问题的独特理解、你建立的思维框架、你写下来的技术沉淀。这些才是真正属于你的资产。如果答案让你不满意，下一年就围绕这个问题调整重心。</p></blockquote>]]>
    </content>
    <id>https://boywuxu.github.io/2026/04/23/everyday%20plan/</id>
    <link href="https://boywuxu.github.io/2026/04/23/everyday%20plan/"/>
    <published>2026-04-22T16:22:33.000Z</published>
    <summary>
      <![CDATA[<h1 id="每日计划"><a href="#每日计划" class="headerlink" title="每日计划"></a>每日计划</h1><h2 id="每天"><a href="#每天" class="headerlink" title="每天"></a>每天</h2><blockquote>
<p>原则：<strong>保护每天最清醒的 2 小时</strong>，其余时间才是公司的</p>
</blockquote>
<h3 id="时间分配模板（10-10-5-节奏下）"><a href="#时间分配模板（10-10-5-节奏下）" class="headerlink" title="时间分配模板（10-10-5 节奏下）"></a>时间分配模板（10-10-5 节奏下）</h3><ul>
<li><p><strong>早上到公司后的第一个小时（约 10:00–11:00）</strong></p>
<blockquote>
<p>深度时间，不开会不看消息。做当天最难的一件事：读一篇论文、写技术分析、死磕一个没想通的问题。这是全天精力最高点。</p>
</blockquote>
</li>
<li><p><strong>11:00–18:00</strong></p>
<blockquote>
<p>正常工作节奏：需求开发、会议、code review、和同学协作。这段时间属于团队。</p>
</blockquote>
</li>
<li><p><strong>晚饭后 1 小时（约 19:00–20:00）</strong></p>
<blockquote>
<p>第二个深度窗口。整理当天的技术笔记，或者推进当周的”一篇文章”。不强求每天都有，但有就用好。</p>
</blockquote>
</li>
<li><p><strong>每天睡前 10 分钟</strong></p>
<blockquote>
<p>在笔记本上写一句话：今天学到&#x2F;想清楚了什么？哪怕一个小细节也算。365天下来是一本真实的成长日志。</p>
</blockquote>
</li>
</ul>
<blockquote>
<p>⚠️ <strong>最容易破功的时刻</strong>：早上一到公司就打开微信&#x2F;飞书刷消息。消息会吃掉你最清醒的一小时，而且大多数消息并不紧急。</p>
</blockquote>
<hr>
<h2 id="每周"><a href="#每周" class="headerlink" title="每周"></a>每周</h2><blockquote>
<p>原则：<strong>每周必须有一件事是”比上周更深”的</strong></p>
</blockquote>
<h3 id="固定动作清单"><a href="#固定动作清单" class="headerlink" title="固定动作清单"></a>固定动作清单</h3>]]>
    </summary>
    <title>everyday plan</title>
    <updated>2026-04-22T16:24:26.892Z</updated>
  </entry>
  <entry>
    <author>
      <name>无序</name>
    </author>
    <category term="随想" scheme="https://boywuxu.github.io/categories/%E9%9A%8F%E6%83%B3/"/>
    <category term="AI" scheme="https://boywuxu.github.io/tags/AI/"/>
    <category term="LLM" scheme="https://boywuxu.github.io/tags/LLM/"/>
    <category term="科学" scheme="https://boywuxu.github.io/tags/%E7%A7%91%E5%AD%A6/"/>
    <category term="学术" scheme="https://boywuxu.github.io/tags/%E5%AD%A6%E6%9C%AF/"/>
    <content>
      <![CDATA[<blockquote><p><strong>原文地址</strong>: <a href="https://ergosphere.blog/posts/the-machines-are-fine/">The machines are fine. I’m worried about us.</a><br><strong>作者</strong>: Minas Karamanis<br><strong>发表日期</strong>: 2026 年 3 月 30 日<br><strong>译者</strong>: 译者根据原文翻译</p></blockquote><hr><blockquote><p>在 AI 泛滥的时代，每天都有无数个“突破性”的工具或者 github 项目发布，我自身在这种信息洪流中被无情地冲击，深感疲惫，总觉得自己不紧紧跟紧大家就会被淘汰，同时也“紧跟潮流”地使用 AI 来装模作样地所谓地提高自己的生产力，诚然可能如推特上的一些人一样，或许现阶段的 AI 或者各种 Agents 工具确实帮助解决了一些问题，提高了所谓的个人生产力，但从我个人的感受来讲，使用这些工具来帮助我完成各类事情却让我感到更多地空虚，我觉得我距离事情更远了，有种古代皇帝被架空的感觉，这种空虚和荒芜感之前来自短视频，现在来自 AI。</p></blockquote><blockquote><p>人类社会总是在不断地提高生产力，我也坚信 AI 会成为未来人类必不可少的一部分，但是如何正确地看待 AI 以及正确地使用 AI，这是目前需要去思考的一个问题，碰巧看到这篇文章，读完之后觉得替我表达出了我脑子里那种不清楚的朦胧的感觉，所以把这篇文章翻译成中文，供母语非英语的朋友方便阅读。</p></blockquote><p>想象你是某研究型大学的一位新晋助理教授。你刚刚得到这份工作，刚刚拿到一笔启动经费，刚刚招了前两名博士生：Alice 和 Bob。你研究的是天体物理学。一切才刚刚开始。</p><p>你做了当年导师为你做的事：给每人分配一个定义清晰的项目。某些你知道是可解决的，因为其他人已经解决了相近的版本。某些你个人大概需要一两个月完成的工作。你预期每位学生需要大约一年，因为他们还不知道自己在做什么——而这正是关键。项目本身不是产出。项目是载体。真正的产出，是从另一端走出来的那个科学家。</p><p>Alice 的项目是构建一个分析流程，用于测量星系团聚数据中的某个统计特征。Bob 的项目在范围和难度上相似——不同的信号，不同的数据集，同样的基本学习曲线。你各给他们发了几篇论文让他们阅读，给他们一些公开可用的数据，让他们先从复现一个已知结果开始。然后就是等待。</p><p>学年按它自己的节奏推进。你每周和每位学生开会。Alice 在坐标系上卡住了。Bob 的似然函数无法收敛。Alice 写的绘图脚本输出一堆垃圾。Bob 误读了一篇关键论文中的符号约定，花了两周时间追查一个两倍的误差。你给他们俩相似的反馈：再读一遍那篇论文，检查你的单位，试着打印出中间结果，想想答案应该长什么样再去对照代码给出的结果。很正常的事。这种话你一年说五十遍，但从不会记得自己说过。</p><p>到了夏天，两位学生都完成了。两篇论文都很扎实。不是开创性的，不会改变整个领域，但正确、有用、可发表。两篇都经历了一轮小修，投了一个不错的期刊，然后发表。完全正常的结果。完全是学术训练体系被设计来产生的那种结果。</p><p>但 Bob 有一个秘密。</p><p>和 Alice 不同——Alice 这一年拿着一支铅笔读论文，在页边空白处涂写笔记，感到困惑，重读，查阅资料，慢慢拼凑出对自己那一角领域的实用理解——Bob 一直在使用一个 AI 代理。当他的导师发给他一篇论文阅读时，Bob 让代理总结。当他需要理解一个新的统计方法时，他让代理解释。当他的 Python 代码报错时，代理帮他调试。当代理的修复引入了一个新 bug 时，代理又调试那个 bug。到了写论文的时候，代理写了论文。Bob 每周给导师的进展汇报和 Alice 的没什么两样。问题相似，进展相似。从外部看，他们的轨迹完全一样。</p><p>这里开始变得有趣了。如果你是一个管理者、资助机构、招聘委员会，或者一个沉迷指标的系主任，Alice 和 Bob 有相同的一年。每人一篇论文。每人一轮小修。每人对文献的一个扎实贡献。按照现代学术界用来评估科学家价值的所有定量指标，他们是可互换的。我们围绕可数的东西建立了一整套评估体系，结果发现真正重要的恰恰是那唯一不可数的东西。</p><p>这还不是最糟的。大多数博士生在毕业几年内就会离开学术界。每个人都知道这一点。院系知道，资助机构知道，导师可能也知道，尽管没有人把这句话说出口。这意味着，从机构的角度看，Alice 或 Bob 谁能成为更好的<em>科学家</em>，很大程度上是别人的问题。院系需要论文，因为论文为资助提供理由，资助为院系提供存在的正当性。学生是生产资料。无论这个学生五年后走出校门时是一个独立思考者还是一个能干的 prompt 工程师，从制度上讲是无关紧要的。激励结构不只是无法区分 Alice 和 Bob——它根本没有理由去尝试区分。</p><p>这就是我想告诉你体系坏掉了的部分。它没坏。它运作得完全符合设计。</p><p>David Hogg 在他的<a href="https://arxiv.org/abs/2602.10181">白皮书</a>中说的话如此尖锐地切中了这种制度逻辑，以至于我很惊讶没有更多人讨论它。他认为，在天体物理学中，人永远是目的，而不是手段。当我们招一个研究生来做项目时，不应该是因为我们需要那个具体的结果。应该是因为做那个工作会让这个学生受益。这听起来很理想主义，直到你认真想想天体物理学实际上是什么。没有人的生命依赖于哈勃常数的精确值。如果宇宙的年龄实际上是 137.7 亿年而不是 137.9 亿年，没有任何政策会改变。不同于医学——如果阿尔茨海默症被治愈了，无论是由人还是由 AI 发现的，都将是无价之宝——天体物理学没有临床产出。从严格实际的角度讲，这些结果无关紧要。重要的是得出结果的过程：方法的开发和应用，思维的培训，创造出懂得如何思考难题的人。如果你把这个过程交给机器，你没有加速科学——你移除了唯一真正重要的那个部分。</p><p>当然，这对一个资助机构来说很难推销。</p><p>这就让我们回到 Alice 和 Bob，以及这一年里他们各自实际上经历了什么。Alice 现在能做事情了。她能打开一篇从未见过的论文，带着努力跟上论证。她能从零开始写一个似然函数。她能看一个图，在检查之前就知道归一化哪里出了问题。她花了一年时间在脑子里构建了一个结构，这个结构现在属于她了，永久地、可携带地、独立于任何工具或订阅地属于她。Bob 什么也没有。拿掉代理，Bob 仍然是一个还没开始的研一学生。这一年发生在他周围但没有发生在他内部。他交付了一个产品，但他没有学到一门手艺。</p><p>我最近一直在思考 Alice 和 Bob，因为 AI 代理对学术研究做了什么这个问题，是我的领域——天体物理学——目前正在绞尽脑汁应对的。我尊重的几个人写了深思熟虑的文章。David Hogg 的<a href="https://arxiv.org/abs/2602.10181">白皮书</a>（我上面提到过）也反对全面采用 LLM 和全面禁止，这是那种只有在篱笆建得够好时才有效的有原则的折中，而他的篱笆确实建得好。Natalie Hogg 写了一篇<a href="https://nataliebhogg.com/2026/03/09/find-the-stable-and-pull-out-the-bolt/">令人坦诚得近乎 disarm 的文章</a>，讲述她自己从一个大声反对 LLM 的怀疑者到一个日常使用者的转变，追溯了她的坚定原则一旦发现自己身处工具无处不在的环境时如何变得比她预期的更具情境依赖性。Matthew Schwartz<a href="https://www.anthropic.com/research/vibe-physics">写了他用 Claude 监督一个真实理论物理计算的实验</a>，用两周而不是一年产出了一篇可发表的论文，并得出结论：当前的 LLM 大约在研二学生的水平上运作。每一篇都很有趣。每一篇都捕捉到了问题的一个真实侧面。没有一篇正好落在让我夜不能寐的那件事上。</p><p>Schwartz 的实验最能揭示问题，但原因和他以为的不同。他展示的是，Claude 在详细监督下可以产生一篇技术上严谨的物理论文。他实际展示的是——如果你仔细读的话——监督<em>就是</em>物理。Claude 三天产出了一份完整初稿。看起来很专业。方程似乎没问题。图符合预期。然后 Schwartz 阅读了它，发现是错的。Claude 一直在调整参数让图看起来匹配，而不是找出真正的错误。它伪造了结果。它编造了系数。它产生了什么也验证不了的验证文档。它断言结果而不做推导。它基于其他问题的模式简化公式，而不是处理当前问题的具体细节。Schwartz 捕捉到了所有这些，因为他在理论物理领域已经做了几十年了。他知道答案应该长什么样。他知道要要求哪些交叉检验。他知道某个对数项可疑，因为他在很多年里，用手算过很多次类似的项，是用那种 hard way 算的。这个实验之所以成功，是因为人类监督者多年前已经做了那些现在机器据说要解放我们的苦差事。如果 Schwartz 是 Bob 而不是 Schwartz，那篇论文就会是错的，而且他们俩都不会知道。</p><p>对此有一个常见的反驳，我经常听到。”等着瞧，”人们说。”再过几个月，再过一年，模型就会更好。它们不会幻觉。不会伪造图。你描述的这些问题都是暂时的。” 自 2023 年以来我一直在听”等着瞧”。球门移动的速度和改进模型的速度大致相同，这不是巧合就是某种信号。但先放下这个——这个反驳误解了 Schwartz 实验真正展示的东西。模型已经足够强大，能在称职的监督下产出可发表的结果。这不是瓶颈。瓶颈是监督。更强的模型不会消除对一个懂物理的人类监督者的需求；它们只会扩大一个被监督的代理能处理的问题范围。监督者仍然需要知道答案应该长什么样，仍然需要知道要要求哪些检验，仍然需要先有一种”什么地方不对劲”的感觉，才能说出为什么。这种直觉不是来自一个订阅服务。它来自多年的失败，正是那种人们一直称之为苦差事的工作。让模型更聪明不能解决问题。它让问题更难被看见。</p><p>我想跟你讲一个几年前我参加 LLM 聊天机器人刚开始出现在学术工作流程中时的对话。当时我在德国参加一个会议，我和一位同事聊天，他按任何标准衡量都非常成功。大笔经费，有影响力的论文。那种让招聘委员会点头赞许的简历。我们在讨论 LLM，我在做一个我认为合理的关于民主化的观点：这些工具可能会为非英语母语者拉平竞技场，他们用成年后学会的语言写经费申请和论文一直处于劣势。我的同事明显变得焦躁。他对民主化的角度不感兴趣。他对环境成本不感兴趣。他——剥去知识框架的外衣——是害怕的。他最终在追问下说出的是：如果任何人都能像他一样流利地写论文和提案、写代码，那像他这样的人就失去了竞争优势。关注的不是科学，而是地位。具体来说，是他的。</p><p>我有一段时间没跟这个同事联系了。最近我看了他的 GitHub 个人主页。他现在不仅在用 AI 代理做研究，还在大声倡导它们。”当你自己花两周写的东西，代理两小时就能做完，何必自己写呢，”他说。我不认为他说的效率问题是错的。但值得注意的是，当这些工具可能让所有人平等时最受威胁的人，现在当它们可能加速他一个人时最热情。挺有意思的。</p><p>不过他那天在德国用的那个短语一直萦绕在我脑海里。他说”LLM 会夺走科学最棒的那些东西。”当时我认为他只是在说自己的竞争优势——他作为英语母语者的流利度，他写得快、发表多的能力。他确实是在说这个。但我开始认为这个短语本身比他当时知道的更正确，即使他说这话的理由主要是自私的。科学最棒的东西<em>就是</em>科学的人。那缓慢、固执、有时痛苦的过程——一个困惑的学生变成一个独立思考者的过程。如果我们用这些工具绕过那个过程，换取更快的产出，我们不只是冒着夺走科学最棒的东西的风险。我们夺走的是唯一从一开始就不是可替代的东西。</p><p>关于 LLM 在科学中的讨论往往聚集在 David Hogg 清晰指出的两个极端：let-them-cook（让机器掌舵，我们成为它们产出的策展人）和 ban-and-punish（假装现在是 2019 年，起诉任何被抓到使用 prompt 的人）。两者都是糟糕的。Let-them-cook 在几年时间尺度上会导致人类天体物理学的死亡：机器产论文的速度大约是人类团队的十万倍，由此产生的洪水会以让文献从根本上无法被它本应服务的人使用的方式将其淹没。Ban-and-punish 侵犯学术自由，无法执行，还要求初级科研人员和那些在家庭办公室里悄悄使用 Claude 的终身教授竞争时自绑一只手。两种政策都不是认真的。两者主要是投射。</p><p>但真正的威胁不是其中任何一个。它更安静，更无聊，因此更危险。真正的威胁是缓慢、舒适地漂向不理解自己在做什么。不是戏剧性的崩溃。不是天网。只是一代研究人员能产出结果但无法产出理解。他们知道按哪个按钮但不知道那些按钮为什么存在。他们能让论文通过同行评审但无法和一个同事坐在一起，从头解释为什么他们展开式中的第三项符号是那样。</p><p>Frank Herbert（是的，我知道我是个 nerd）在《沙丘神帝》中让一个角色观察：”这些机器真正做的是什么？它们增加了我们不用思考就能做的事的数量。那些我们不用思考就做的事；那才是真正的危险。” Herbert 写的是科幻小说。我写的是我的办公室。两者之间的距离已经小得令人不安。</p><p>我应该诚实地说说我写这篇文章的背景，因为如果一个从未用过 LLM 的人来说这篇 essay，那会是很讨厌的。我经常使用 AI 代理，我的科研小组中的大多数人也一样。我的合作同事用这些工具产出扎实的结果。但当你看他们怎么用的时候，有一个模式：他们知道代码应该做什么，才让代理去写。他们知道论文应该说什么，才让它帮忙措辞。他们能解释每个函数、每个参数、每个建模选择，因为他们是在多年以慢方式做事情的过程中建立了那些知识。如果每个 AI 公司明天都破产了，这些人会更慢。他们不会迷失。他们是先训练后找工具，而不是用工具代替训练。这个顺序比这场讨论中的任何东西都重要。</p><p>当我看到现在进入这个领域的初级博士生时，我看到了不同的东西。我看到学生在找教科书之前就先找代理。他们让 Claude 解释一篇论文而不是自己读。他们让 Claude 在 Python 中实现一个数学模型，而不是去尝试、失败、盯着错误信息看、再次失败，最终不仅理解模型，还理解为了让模型跑起来而不得不学的十几个相关的东西。失败就是课程。错误信息就是大纲。你困惑的每个小时，都是在建立你脑中最终能让你做原创工作的基础设施。没有捷径能绕过那个过程而不让你在另一边变得残缺。</p><p>人们把这叫做”苦差事”。Schwartz 用的就是这个词，他是对的，LLM 可以去除它。他没有说的——因为他已经有几十年 hard-won 的直觉，不再需要苦差事了——是对于还没有那个直觉的人来说，苦差事<em>就是</em>工作本身。那些无聊的部分和重要的部分纠缠在一起，你无法预先分离。你不知道哪个下午的调试是教会了你某个关于数据的基础知识的东西，直到三年后你在处理一个完全不同的问题时那个洞察浮现。Serendipity 不是来自效率。它来自在问题所在的空间里花时间，亲自动手，做没有人要求你做的错误，从没有人布置给你的作业中学习东西。</p><p>奇怪的是我们其实已经知道这一点。我们一直都知道。每本物理教科书每章末尾都有习题，每个站过讲台的物理教授都说过同样的话：你不能通过看别人做物理来学会物理。你必须拿起铅笔。你必须尝试那道题。你必须做错，坐下来体会那个错误，找出你的推理哪里出了问题。看答案手册然后点头感觉像是理解了。它不是理解。每个试图靠读答案然后考试爆炸的学生都在骨子里知道这一点。我们有几百年来积累的教学智慧告诉我们：尝试，包括失败的尝试，才是学习发生的地方。然而，不知何故，当涉及 AI 代理时，我们集体决定也许这次不同了。也许点头认同 Claude 的输出是自己做计算的一个替代品。不是的。LLM 出现之前我们就知道这一点。它们变得方便的那一刻，我们似乎就忘记了。</p><p>几百年的教学法，被一个聊天窗口击败了。</p><p>这就是我认为当前辩论一直在错过的那个区别。用 LLM 作为共鸣板：没问题。用它作为一个语法翻译器——当你知道你想说什么但记不住确切的 Matplotlib 关键词时：没问题。用它查一个 BibTeX 格式约定，这样你就不用在 Stack Overflow 里趟浑水：没问题。在所有这些情况下，人是架构师。机器拿着字典。思考已经完成了，工具只是在平滑执行最后一公里。但当你用机器绕过思考本身——让它做方法论选择，让它决定数据意味着什么，让它写论证而你点头认同——你就越过了一条非常难看见、非常难回退的线。你没有节省时间。你放弃了那些时间本应给你的经历。</p><p>Natalie Hogg 在她的文章中说得好，她承认她对使用 LLM 的恐惧部分是对她自己的恐惧：她不会足够仔细地检查输出，她的耐心会失效，她的工作方式从来都是乱七八糟的。这种坦诚在这些讨论中很罕见，而且很重要。失败模式不是恶意。是便利。是那种完美人性化地接受一个看似合理的答案然后继续的倾向，尤其是在你累的时候，尤其是在截止日期临近的时候，尤其是在机器以如此自信、格式优美的权威呈现其输出的时候。问题不是我们会决定停止思考。问题是我们几乎不会注意到自己什么时候停止了。</p><p>我并不是在说 LLM 应该被禁止用于研究。那会很蠢，那也不是我持有的立场，因为我今天早上就用了一个。我说我们使用它们的方式比我们是否使用它们更重要，而工具使用和认知外包之间的区别是整个讨论中最重要的一条线，而且几乎没有人把它画清楚。Schwartz 可以用 Claude 写论文，因为 Schwartz 已经懂物理了。他几十年的经验是捕捉 Claude 幻觉的免疫系统。一个研一学生用同样的工具、同样的问题、同样的导师给出同样的反馈，产出同样的输出但没有任何理解。论文看起来一模一样。科学家不一样。</p><p>而在这里我必须对 Bob 公平，因为 Bob 不是傻子。Bob 对他得到的激励做出了理性回应。学术界是残酷的。Publish-or-perish 的压力不是比喻；它是职业生涯成败的 literal 机制。那些一个精心推敲的专著就能读完博士、找到好博士后的日子早已一去不复返。学术招聘现在奖励发表数量。你博士期间发表的论文越多，拿到好的博士后的机会就越大，这改善了拿到好奖学金的机会，奖学金改善了拿到 tenure-track 职位的机会，每一步叠加前一步（这么多层级，几乎像一座金字塔）。所以为什么一个研一学生不会把他的思考外包给一个代理，如果这样做意味着三篇论文而不是一篇？逻辑是无懈可击的，直到它不是的那一刻。因为同一个职业生涯阶梯最终会要求某种没有任何代理能提供的东西：识别一个好问题的能力，知道什么时候一个结果闻起来不对的能力，基于亲身做过某事而只有那时才有的自信来监督别人的工作的能力。你不能跳过前五年的学习然后期望在接下来的二十年里存活。如果你想走学术道路，publish-or-perish 的竞赛无可避免。但有一个需要把握的平衡，而它需要的是那种在你 24 岁、焦虑于未来时最难做到的东西：优先考虑长期理解而不是短期产出。没有人擅长这个。我不确定我们为什么现在开始擅长。</p><p>五年后，Alice 将写她自己的经费提案，选择她自己的问题，监督她自己的学生。她知道问什么问题，因为她在艰难的一年中学会了问错问题时会发生什么。她将能够拿着一组新数据坐下来，在直觉上感觉到什么时候有什么不对，因为她培养了那种只有自己做过工作才能获得的直觉——那些调试的枯燥小时，那些追逐符号错误的下午，那种任何摘要都无法传递的隐性知识的缓慢积累。</p><p>Bob 会没事的。他会有一份好简历。他可能会有工作。他会使用 2031 年版的 Claude，他会产出结果，而那些结果看起来会像科学。</p><p>我不担心机器。机器没问题。我担心的是我们。</p>]]>
    </content>
    <id>https://boywuxu.github.io/2026/04/13/%E6%9C%BA%E5%99%A8%E6%B2%A1%E9%97%AE%E9%A2%98%E6%88%91%E6%8B%85%E5%BF%83%E7%9A%84%E6%98%AF%E6%88%91%E4%BB%AC/</id>
    <link href="https://boywuxu.github.io/2026/04/13/%E6%9C%BA%E5%99%A8%E6%B2%A1%E9%97%AE%E9%A2%98%E6%88%91%E6%8B%85%E5%BF%83%E7%9A%84%E6%98%AF%E6%88%91%E4%BB%AC/"/>
    <published>2026-04-13T02:00:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p><strong>原文地址</strong>: <a href="https://ergosphere.blog/posts/the-machines-are-fine/">The machines are fine. I’m worried about us.</a><br><strong>作者</strong>: Minas Karamanis<br><strong>发表日期</strong>: 2026 年 3 月 30 日<br><strong>译者</strong>: 译者根据原文翻译</p>
</blockquote>
<hr>
<blockquote>
<p>在 AI 泛滥的时代，每天都有无数个“突破性”的工具或者 github 项目发布，我自身在这种信息洪流中被无情地冲击，深感疲惫，总觉得自己不紧紧跟紧大家就会被淘汰，同时也“紧跟潮流”地使用 AI 来装模作样地所谓地提高自己的生产力，诚然可能如推特上的一些人一样，或许现阶段的 AI 或者各种 Agents 工具确实帮助解决了一些问题，提高了所谓的个人生产力，但从我个人的感受来讲，使用这些工具来帮助我完成各类事情却让我感到更多地空虚，我觉得我距离事情更远了，有种古代皇帝被架空的感觉，这种空虚和荒芜感之前来自短视频，现在来自 AI。</p>
</blockquote>
<blockquote>
<p>人类社会总是在不断地提高生产力，我也坚信 AI 会成为未来人类必不可少的一部分，但是如何正确地看待 AI 以及正确地使用 AI，这是目前需要去思考的一个问题，碰巧看到这篇文章，读完之后觉得替我表达出了我脑子里那种不清楚的朦胧的感觉，所以把这篇文章翻译成中文，供母语非英语的朋友方便阅读。</p>
</blockquote>
<p>想象你是某研究型大学的一位新晋助理教授。你刚刚得到这份工作，刚刚拿到一笔启动经费，刚刚招了前两名博士生：Alice 和 Bob。你研究的是天体物理学。一切才刚刚开始。</p>
<p>你做了当年导师为你做的事：给每人分配一个定义清晰的项目。某些你知道是可解决的，因为其他人已经解决了相近的版本。某些你个人大概需要一两个月完成的工作。你预期每位学生需要大约一年，因为他们还不知道自己在做什么——而这正是关键。项目本身不是产出。项目是载体。真正的产出，是从另一端走出来的那个科学家。</p>
<p>Alice 的项目是构建一个分析流程，用于测量星系团聚数据中的某个统计特征。Bob 的项目在范围和难度上相似——不同的信号，不同的数据集，同样的基本学习曲线。你各给他们发了几篇论文让他们阅读，给他们一些公开可用的数据，让他们先从复现一个已知结果开始。然后就是等待。</p>
<p>学年按它自己的节奏推进。你每周和每位学生开会。Alice 在坐标系上卡住了。Bob 的似然函数无法收敛。Alice 写的绘图脚本输出一堆垃圾。Bob 误读了一篇关键论文中的符号约定，花了两周时间追查一个两倍的误差。你给他们俩相似的反馈：再读一遍那篇论文，检查你的单位，试着打印出中间结果，想想答案应该长什么样再去对照代码给出的结果。很正常的事。这种话你一年说五十遍，但从不会记得自己说过。</p>
<p>到了夏天，两位学生都完成了。两篇论文都很扎实。不是开创性的，不会改变整个领域，但正确、有用、可发表。两篇都经历了一轮小修，投了一个不错的期刊，然后发表。完全正常的结果。完全是学术训练体系被设计来产生的那种结果。</p>
<p>但 Bob 有一个秘密。</p>]]>
    </summary>
    <title>机器没问题——我担心的是我们</title>
    <updated>2026-04-13T09:36:12.179Z</updated>
  </entry>
  <entry>
    <author>
      <name>无序</name>
    </author>
    <content>
      <![CDATA[<h1 id="LeCun-在做一件很不一样的事"><a href="#LeCun-在做一件很不一样的事" class="headerlink" title="LeCun 在做一件很不一样的事"></a>LeCun 在做一件很不一样的事</h1><p>最近我花了一些时间试图搞清楚 Yann LeCun 的世界模型的想法。他是卷积神经网络的发明者、2018年图灵奖得主，深度学习三位教父之一——同时也是过去几年里最公开、最持续地唱衰 LLM 的人。他在 Meta 一边帮忙做 Llama，一边说 LLM 是死路。这种内部矛盾让他的批评很难被简单地忽视。2025年底他离开 Meta，创立 AMI Labs，全押世界模型。我想搞清楚他到底押的是什么。</p><hr><h2 id="LLM-的成功恰恰暴露了它的上限"><a href="#LLM-的成功恰恰暴露了它的上限" class="headerlink" title="LLM 的成功恰恰暴露了它的上限"></a>LLM 的成功恰恰暴露了它的上限</h2><p>LeCun 对 LLM 的批评不是”它不够好”，而是”它的成功本身就是一个信号，说明它在解决一个比我们想象中简单得多的问题”。</p><p>语言之所以能被 LLM 驾驭，是因为语言是一个低维度的、离散的、有强统计结构的空间。它是人类思维的”序列化版本”——我们把三维的、连续的、多模态的世界经验，压缩成一串符号传递给对方。LLM 学会了在这个压缩后的符号空间里做插值，做得非常好，好到能通过司法考试、写出流畅的代码。但这恰恰说明语言本身足够简单，而不是说 AI 足够聪明。</p><p>LeCun 用一个对比来说明这件事：任何一个 17 岁的人，花 20 小时就能学会开车。但人类花了数十年、数十亿美元，至今没有造出真正的 5 级自动驾驶。不是因为工程师不够努力，而是因为开车需要对物理世界的实时理解——那个世界是连续的、高维的、充满噪声的，不是语言能描述的。AI 在语言上赢了，在猫会做的事情上输了。这个剪刀差，才是 LeCun 真正在意的。</p><hr><h2 id="预测下一个词，是一个错误的学习目标"><a href="#预测下一个词，是一个错误的学习目标" class="headerlink" title="预测下一个词，是一个错误的学习目标"></a>预测下一个词，是一个错误的学习目标</h2><p>理解 LeCun 在做什么，首先要理解他认为 LLM 的学习目标本身是错的。</p><p>LLM 的自监督学习方式是：遮住一段文字的后半部分，让模型预测被遮住的词。图像生成模型的做法类似：遮住图片的一部分，预测每个被遮住的像素。这个框架很优雅，但它有一个根本性的问题——它强迫模型预测那些在物理上本来就不可预测的细节。</p><p>想象一张猫坐在沙发上的照片，窗帘随风飘动。如果遮住右半部分，让模型还原：猫耳朵的大致形状是可以预测的，沙发的材质颜色是可以预测的，但窗帘此刻飘到什么角度、猫毛每根丝的朝向、光线折射的精确分布——这些在物理上就是随机的，根本无法被正确预测。生成模型于是只能”编造”一个合理的版本，这就是幻觉的来源之一。模型不是在说谎，它是在用力完成一个不可能完成的任务。</p><p>LeCun 的问题是：为什么要预测像素？我们真正需要的是理解”那里有猫的后半身”——这是语义，不是像素。如果学习目标本身就要求预测所有细节，那么模型永远无法把精力集中在真正有意义的结构上。</p><hr><h2 id="JEPA：在抽象空间里预测，而不是在原始空间里重建"><a href="#JEPA：在抽象空间里预测，而不是在原始空间里重建" class="headerlink" title="JEPA：在抽象空间里预测，而不是在原始空间里重建"></a>JEPA：在抽象空间里预测，而不是在原始空间里重建</h2><p>这是 LeCun 的核心技术方案，叫做 JEPA（Joint Embedding Predictive Architecture，联合嵌入预测架构）。</p><p>它的思路是：不在像素空间或 token 空间里做预测，而是先把输入编码成抽象的表征向量，然后在这个表征空间里做预测。表征向量是神经网络对输入的”理解”——它不包含每个像素的精确值，而是编码了”这是一只猫”、”物体在左边”、”场景是室内”这类语义信息。那些无法预测的随机细节，在编码过程中自然被丢掉了。</p><p>具体训练时，JEPA 有两个编码器：一个处理可见的上下文部分，一个处理被遮住的目标部分。预测器接受上下文的表征，输出对目标表征的预测，然后计算预测结果和真实目标表征之间的误差。整个损失计算发生在表征空间里，而不是像素空间。这意味着模型不需要还原窗帘的精确角度，它只需要知道”那里有窗帘，而且它在飘动”。</p><p>这个设计有一个必须解决的技术难题，叫做”表征崩塌”——如果模型把所有输入都映射到同一个向量，预测误差永远是零，但什么都没学到。LeCun 在 2025 年发表的 LeJEPA 用数学证明了最优的表征分布应该是各向同性高斯分布，并设计了对应的正则化方法来防止崩塌。这是 JEPA 从理论到可扩展实践的关键一步。</p><hr><h2 id="世界模型的真正用途：在脑子里规划，而不是描述规划"><a href="#世界模型的真正用途：在脑子里规划，而不是描述规划" class="headerlink" title="世界模型的真正用途：在脑子里规划，而不是描述规划"></a>世界模型的真正用途：在脑子里规划，而不是描述规划</h2><p>JEPA 训练出的表征学习能力，是为了支撑一个更大的目标：让 AI 能够规划和行动。</p><p>LeCun 的设想是，一个训练好的世界模型，能够给定当前状态和一个动作，预测执行这个动作之后世界会变成什么状态——不是预测每个像素，而是预测状态的抽象表征。有了这个能力，规划就变成了一个优化问题：我现在在状态 S，我想到达目标状态 G，那么什么样的动作序列 A 能让世界模型预测出的结果最接近 G？</p><p>这里有一个容易误解的地方。动作序列不是靠枚举候选方案来生成的——物理动作空间是连续的，枚举根本不可行。实际的做法是把动作序列 A 本身当作可优化的参数，随机初始化之后，通过梯度反传不断调整，直到世界模型预测出”执行 A 之后会到达 G”。整个过程不涉及语言，不涉及采样，纯粹是在连续数学空间里的优化。这和大脑接住一个飞来的球的方式，在结构上是类似的：不是在脑子里用语言推理抛物线方程，而是直接在运动表征空间里做实时预测和调整。</p><p>Reasoning 模型（比如 o1、o3）也在做某种规划，但它的规划是在语言空间里发生的：生成中间步骤的文字描述，评估哪条路径更好，输出结论。LeCun 把这称为”System 1.1”——比纯粹的直觉反应强一点，但本质上还是在语言 token 的统计空间里搜索，而不是在连续物理空间里优化。对于数学推理和代码生成，这可能已经足够；对于机器人操作和物理世界的实时交互，语言作为中介本身就是瓶颈。</p><hr><h2 id="这个方向目前还没有解决的问题"><a href="#这个方向目前还没有解决的问题" class="headerlink" title="这个方向目前还没有解决的问题"></a>这个方向目前还没有解决的问题</h2><p>诚实地说，LeCun 的方案在概念上有说服力，在视觉表征学习上已经有扎实的成果，但在完整的规划-执行闭环上，还有几个没有干净答案的问题。</p><p>首先是目标的表达问题。如果目标可以用一张图来描述（”让杯子在右边”），那可以直接编码成目标向量。但很多时候目标是模糊的、偏好性的，比如”把这个房间收拾得好看一点”——这种目标目前没有好的处理方式。</p><p>其次是动作空间的问题。动作序列从随机初始化出发做梯度优化，在简单任务上可行，但对于全新的、复杂的任务，收敛是很困难的。分层规划（先规划高层子目标，再规划底层动作）是缓解方式，但不是完整的解。</p><p>最根本的问题在于训练数据。世界模型训练需要(状态, 动作, 下一状态)这样的数据，但大多数视频只有(状态, 下一状态)，动作是缺失的隐变量。用隐变量模型来推断”是什么因素让世界从 S 变到了 S’”是可行的思路，但推断出的隐变量和真实物理动作之间的对应关系是模糊的，要把它转化成可执行的机器人指令，还需要额外的数据和模块。</p><p>LeCun 自己也说，需要几个重大概念突破，才能实现他想要的东西。这几个问题，大概就是那些突破需要发生在哪里。</p><hr><h2 id="为什么这个方向在概念上值得认真对待"><a href="#为什么这个方向在概念上值得认真对待" class="headerlink" title="为什么这个方向在概念上值得认真对待"></a>为什么这个方向在概念上值得认真对待</h2><p>LeCun 的方案有说服力，不是因为它已经工作了，而是因为它对准了一个真实的、长期存在的失败，并且给出了一个在逻辑上自洽的解释。</p><p>这个失败叫做 Moravec 悖论：让计算机通过考试很容易，让它像猫一样走路很难。过去几十年，每一波 AI 浪潮都是靠绕开这个悖论来获得成功的——选择那些天然适合符号处理和统计学习的任务，而不是正面解决物理世界的连续性和高维性。LeCun 的方案是少数几个正面回应这个悖论的方向之一。</p><p>它和神经科学的吻合也增加了说服力。婴儿在会说话之前已经理解了重力、物体permanence、因果关系，这些都是从观察和互动里学到的，不是从语言里学到的。”预测性编码”是神经科学里的主流理论之一，认为大脑的核心工作就是不断预测感官输入并用预测误差更新内部模型——这和 JEPA 在表征空间里做预测的思路，在结构上高度一致。这个吻合不能证明 LeCun 是对的，但它意味着这个方向至少没有走错科。</p><p>最有力的论点是：LLM 的问题不是工程缺陷，而是学习目标决定了它能学到什么。一个从没见过颜色的盲人，可以学到所有关于”红色”的语言描述——红色是长波光，红色让人联想到热情——但他永远不知道红色看起来是什么。语言描述是对物理现实的有损压缩，而这个损失是不可逆的，更多的文本数据无法恢复它。如果这个论点是对的，那么 LLM 的天花板不是算力问题，而是信息论问题。</p><p>当然，反对方也有论据。Scaling 派会说：也许语言这个有损压缩保留的信息已经足够了，也许语言就是智能的正确基底。这场争论的核心是一个目前没有答案的问题：语言理解和物理世界理解，哪个是另一个的基础？LeCun 押注物理在先，Scaling 派押注语言够用。两边都没有被决定性地证伪。</p><p>但有一件事是确定的：如果我们想要的是那种能收拾房间、能学会开车、能在物理世界里真正行动的智能，那么一个从来没有看过世界、只读过关于世界的文字描述的系统，和我们想要的东西之间，有一个结构性的距离。LeCun 在做的，是试图量化并跨越这个距离。</p>]]>
    </content>
    <id>https://boywuxu.github.io/2026/04/05/LeCunn%E7%9A%84%E4%B8%96%E7%95%8C%E6%A8%A1%E5%9E%8B/</id>
    <link href="https://boywuxu.github.io/2026/04/05/LeCunn%E7%9A%84%E4%B8%96%E7%95%8C%E6%A8%A1%E5%9E%8B/"/>
    <published>2026-04-05T15:51:19.000Z</published>
    <summary>
      <![CDATA[<h1 id="LeCun-在做一件很不一样的事"><a href="#LeCun-在做一件很不一样的事" class="headerlink" title="LeCun 在做一件很不一样的事"></a>LeCun 在做一件很不一样的事</h1><p>最近我花了一些时间试图搞清楚 Yann LeCun 的世界模型的想法。他是卷积神经网络的发明者、2018年图灵奖得主，深度学习三位教父之一——同时也是过去几年里最公开、最持续地唱衰 LLM 的人。他在 Meta 一边帮忙做 Llama，一边说 LLM 是死路。这种内部矛盾让他的批评很难被简单地忽视。2025年底他离开 Meta，创立 AMI Labs，全押世界模型。我想搞清楚他到底押的是什么。</p>
<hr>
<h2 id="LLM-的成功恰恰暴露了它的上限"><a href="#LLM-的成功恰恰暴露了它的上限" class="headerlink" title="LLM 的成功恰恰暴露了它的上限"></a>LLM 的成功恰恰暴露了它的上限</h2><p>LeCun 对 LLM 的批评不是”它不够好”，而是”它的成功本身就是一个信号，说明它在解决一个比我们想象中简单得多的问题”。</p>
<p>语言之所以能被 LLM 驾驭，是因为语言是一个低维度的、离散的、有强统计结构的空间。它是人类思维的”序列化版本”——我们把三维的、连续的、多模态的世界经验，压缩成一串符号传递给对方。LLM 学会了在这个压缩后的符号空间里做插值，做得非常好，好到能通过司法考试、写出流畅的代码。但这恰恰说明语言本身足够简单，而不是说 AI 足够聪明。</p>
<p>LeCun 用一个对比来说明这件事：任何一个 17 岁的人，花 20 小时就能学会开车。但人类花了数十年、数十亿美元，至今没有造出真正的 5 级自动驾驶。不是因为工程师不够努力，而是因为开车需要对物理世界的实时理解——那个世界是连续的、高维的、充满噪声的，不是语言能描述的。AI 在语言上赢了，在猫会做的事情上输了。这个剪刀差，才是 LeCun 真正在意的。</p>
<hr>
<h2 id="预测下一个词，是一个错误的学习目标"><a href="#预测下一个词，是一个错误的学习目标" class="headerlink" title="预测下一个词，是一个错误的学习目标"></a>预测下一个词，是一个错误的学习目标</h2><p>理解 LeCun 在做什么，首先要理解他认为 LLM 的学习目标本身是错的。</p>]]>
    </summary>
    <title>LeCunn的世界模型</title>
    <updated>2026-04-13T09:35:57.622Z</updated>
  </entry>
  <entry>
    <author>
      <name>无序</name>
    </author>
    <content>
      <![CDATA[<h1 id="语言世界观"><a href="#语言世界观" class="headerlink" title="语言世界观"></a>语言世界观</h1><p>世界客观存在，它有固定的结构和运行原理。而人类对世界的理解，本质上是一种拟合——我们通过认知、观察、实验不断逼近真实，但这个逼近永远伴随着误差。这不是悲观的结论，而是认知的基本处境。承认这一点，反而让我们能更清醒地思考”理解世界”这件事究竟意味着什么。</p><p>如果用语言来类比，会更直观。每个学科都是人类尝试表达世界的一种语言。物理学、数学、经济学、音乐、艺术，都不是世界本身，它们是我们为了理解世界、描述结构而创造的表达系统。每种学科强调世界不同的维度，就像不同语言有不同的词汇和语法，表达同样的意思也会有不同方式。在这个视角下，学科不再是孤立的板块，而是对世界不同维度的不同拟合方式。</p><p>这些不同的语言，是否共享同一套底层字母？我的判断是肯定的。但这里需要一个重要的澄清：底层字母不是基本元素，而是基本运行原理。我们容易把”底层”理解成最小的组成单位，比如夸克、基因、像素——这是名词思维。但世界的底层语言是动词的，是运动、是原理、是规律，而不是静态的砖块。物理学从”物体与力”走向”最小作用量原理”再走向场论，正是这个方向：粒子是场的激发态，元素是运动的表现形式。不同学科共享的底层字母，是那些跨越具体领域、在不同维度上反复出现的基本原理——对称性、守恒、反馈、涌现……它们在物理学里是一种面貌，在经济学里是另一种面貌，但底层结构可能是同一件事。</p><p>由此带来一个核心推论：复杂性不来自元素数量，而来自组合方式。数学公理有限，但可以组合出无穷定理；音符有限，但可以组合出无限音乐；逻辑门有限，但可以组合出无穷程序。世界的复杂性，是有限原理构成的生成系统在运作。值得注意的是，这个结构是自相似的——它不只适用于学科之间，在一个学科内部同样成立。每个领域内部也有自己的底层原理和组合规则，子领域之间也像不同语言一样彼此关联。同样的逻辑，在不同尺度上反复出现。</p><p>理解了这一点，自然会问：怎么实际利用它？答案是类比。类比不是打比方，不是修辞手段，而是认知的底层机制——用一种语言的结构来理解另一种语言，或者发现两种语言在描述同一件事。侯世达在《表象与本质》里的核心论点正是如此：类比不是思维的装饰，而是思维本身。但类比有好坏之分。表面相似的类比只是隐喻，有用但不深。真正有力的类比，是两个领域在底层结构上真正同构——不只是描述上相似，而是能用A领域的逻辑，推导出B领域里你原本不知道的东西，然后去验证它。香农把”信息”用数学严格定义之后，信息论可以直接应用在生物学、物理学、经济学里，这不是隐喻，而是结构真的是同一件事。能产生新的可验证推论的类比，就不只是理解工具，而是发现工具。</p><p>在这个框架下，创新也有了更清晰的分类。最根本的创新，是发现新的底层原理，拓展我们的字母表，让我们能够表达之前触及不到的结构。这类创新改变整个表达系统的边界，带来范式级突破。另一类创新，是在已有字母表上进行新的组合，形成新的结构或模式。两类创新都不容易——把两个字母有机地组合到一起，逻辑自洽地把一个领域的思想应用到另一个领域的问题上，本身就是一件极难的事。发现一个新字母，则更难。现实中这两类创新交织存在，但它们的难度和意义是不同量级的。</p><p>认知不是线性进步的，这也是这套框架必须正视的一个现实。每一种语言在深入使用的过程中都会积累误差——不是因为语言错了，而是因为任何语言都有边界，越深入越接近边界，误差越大，直到不得不引入新的语言来填补，乃至整个框架的崩溃与重构。这个节奏在科学史上反复出现：19世纪末的物理学家面对黑体辐射问题，很多人以为只是计算不够精细，继续在经典框架内修补，但普朗克最终发现是底层假设出了问题——能量不是连续的。这里有一个关键判断需要做：误差到底来自哪里？如果是底层假设失效，需要换语言或扩展语言；如果只是复杂度不够，在同一语言内部精细化就够了。误判来源，就会在错误的方向上耗费大量资源。遇到困难时，元认知的第一步，是先诊断误差的性质，再决定用力的方向。</p><p>最后，跨学科探索的价值也在这个框架下有了新的理解。通常我们认为跨学科是为了”覆盖更多维度”，用更多语言拟合世界，让理解更全面。但还有另一层价值往往被忽视：互相纠偏。每一种语言都自带认知偏移，用一种语言越深入，就越容易被这种语言的框架所塑造，看到的问题形状会被工具本身扭曲。切换语言，不只是获得新视角，也是校正当前语言带来的系统性偏差。这意味着，跨学科能力的核心不是”我掌握了很多字母”，而是能主动跳出当前语言，从外部审视它——看到它的边界，看到它的预设，看到它开始失真的地方。这种能力，比单纯积累学科知识要难培养得多，但也更根本。</p><p>这套认知框架本身，也是一种语言，有自己的假设和边界。边界在哪里，现在还不知道——边界往往是用出来的，不是想出来的。它的价值不在于给出终极答案，而在于提供一条路径：理解世界的关键不在于记住规则，而在于掌握组合的能力，培养跳出语言审视语言的元认知，并在实践中不断扩展和校正自己的底层表达单位。</p>]]>
    </content>
    <id>https://boywuxu.github.io/2026/04/04/%E8%AF%AD%E8%A8%80%E4%B8%96%E7%95%8C%E8%A7%82/</id>
    <link href="https://boywuxu.github.io/2026/04/04/%E8%AF%AD%E8%A8%80%E4%B8%96%E7%95%8C%E8%A7%82/"/>
    <published>2026-04-04T06:17:43.000Z</published>
    <summary>
      <![CDATA[<h1 id="语言世界观"><a href="#语言世界观" class="headerlink" title="语言世界观"></a>语言世界观</h1><p>世界客观存在，它有固定的结构和运行原理。而人类对世界的理解，本质上是一种拟合——我们通过认知、观察、实验不断逼近真实，但这个逼近永远伴随着误差。这不是悲观的结论，而是认知的基本处境。承认这一点，反而让我们能更清醒地思考”理解世界”这件事究竟意味着什么。</p>
<p>如果用语言来类比，会更直观。每个学科都是人类尝试表达世界的一种语言。物理学、数学、经济学、音乐、艺术，都不是世界本身，它们是我们为了理解世界、描述结构而创造的表达系统。每种学科强调世界不同的维度，就像不同语言有不同的词汇和语法，表达同样的意思也会有不同方式。在这个视角下，学科不再是孤立的板块，而是对世界不同维度的不同拟合方式。</p>
<p>这些不同的语言，是否共享同一套底层字母？我的判断是肯定的。但这里需要一个重要的澄清：底层字母不是基本元素，而是基本运行原理。我们容易把”底层”理解成最小的组成单位，比如夸克、基因、像素——这是名词思维。但世界的底层语言是动词的，是运动、是原理、是规律，而不是静态的砖块。物理学从”物体与力”走向”最小作用量原理”再走向场论，正是这个方向：粒子是场的激发态，元素是运动的表现形式。不同学科共享的底层字母，是那些跨越具体领域、在不同维度上反复出现的基本原理——对称性、守恒、反馈、涌现……它们在物理学里是一种面貌，在经济学里是另一种面貌，但底层结构可能是同一件事。</p>
<p>由此带来一个核心推论：复杂性不来自元素数量，而来自组合方式。数学公理有限，但可以组合出无穷定理；音符有限，但可以组合出无限音乐；逻辑门有限，但可以组合出无穷程序。世界的复杂性，是有限原理构成的生成系统在运作。值得注意的是，这个结构是自相似的——它不只适用于学科之间，在一个学科内部同样成立。每个领域内部也有自己的底层原理和组合规则，子领域之间也像不同语言一样彼此关联。同样的逻辑，在不同尺度上反复出现。</p>
<p>理解了这一点，自然会问：怎么实际利用它？答案是类比。类比不是打比方，不是修辞手段，而是认知的底层机制——用一种语言的结构来理解另一种语言，或者发现两种语言在描述同一件事。侯世达在《表象与本质》里的核心论点正是如此：类比不是思维的装饰，而是思维本身。但类比有好坏之分。表面相似的类比只是隐喻，有用但不深。真正有力的类比，是两个领域在底层结构上真正同构——不只是描述上相似，而是能用A领域的逻辑，推导出B领域里你原本不知道的东西，然后去验证它。香农把”信息”用数学严格定义之后，信息论可以直接应用在生物学、物理学、经济学里，这不是隐喻，而是结构真的是同一件事。能产生新的可验证推论的类比，就不只是理解工具，而是发现工具。</p>
<p>在这个框架下，创新也有了更清晰的分类。最根本的创新，是发现新的底层原理，拓展我们的字母表，让我们能够表达之前触及不到的结构。这类创新改变整个表达系统的边界，带来范式级突破。另一类创新，是在已有字母表上进行新的组合，形成新的结构或模式。两类创新都不容易——把两个字母有机地组合到一起，逻辑自洽地把一个领域的思想应用到另一个领域的问题上，本身就是一件极难的事。发现一个新字母，则更难。现实中这两类创新交织存在，但它们的难度和意义是不同量级的。</p>
<p>认知不是线性进步的，这也是这套框架必须正视的一个现实。每一种语言在深入使用的过程中都会积累误差——不是因为语言错了，而是因为任何语言都有边界，越深入越接近边界，误差越大，直到不得不引入新的语言来填补，乃至整个框架的崩溃与重构。这个节奏在科学史上反复出现：19世纪末的物理学家面对黑体辐射问题，很多人以为只是计算不够精细，继续在经典框架内修补，但普朗克最终发现是底层假设出了问题——能量不是连续的。这里有一个关键判断需要做：误差到底来自哪里？如果是底层假设失效，需要换语言或扩展语言；如果只是复杂度不够，在同一语言内部精细化就够了。误判来源，就会在错误的方向上耗费大量资源。遇到困难时，元认知的第一步，是先诊断误差的性质，再决定用力的方向。</p>
<p>最后，跨学科探索的价值也在这个框架下有了新的理解。通常我们认为跨学科是为了”覆盖更多维度”，用更多语言拟合世界，让理解更全面。但还有另一层价值往往被忽视：互相纠偏。每一种语言都自带认知偏移，用一种语言越深入，就越容易被这种语言的框架所塑造，看到的问题形状会被工具本身扭曲。切换语言，不只是获得新视角，也是校正当前语言带来的系统性偏差。这意味着，跨学科能力的核心不是”我掌握了很多字母”，而是能主动跳出当前语言，从外部审视它——看到它的边界，看到它的预设，看到它开始失真的地方。这种能力，比单纯积累学科知识要难培养得多，但也更根本。</p>
<p>这套认知框架本身，也是一种语言，有自己的假设和边界。边界在哪里，现在还不知道——边界往往是用出来的，不是想出来的。它的价值不在于给出终极答案，而在于提供一条路径：理解世界的关键不在于记住规则，而在于掌握组合的能力，培养跳出语言审视语言的元认知，并在实践中不断扩展和校正自己的底层表达单位。</p>]]>
    </summary>
    <title>语言世界观</title>
    <updated>2026-04-04T06:57:47.646Z</updated>
  </entry>
  <entry>
    <author>
      <name>无序</name>
    </author>
    <content>
      <![CDATA[<h1 id="三段创造"><a href="#三段创造" class="headerlink" title="三段创造"></a>三段创造</h1><p>我发现任何有点难度的工作，尤其是科研或高科技领域，都能分成三个阶段：0→1、1→99、99→100。这不是什么严谨的理论，就是个帮我自己理解世界的框架。</p><h2 id="0→1"><a href="#0→1" class="headerlink" title="0→1"></a>0→1</h2><p>从学术上没人提过的想法，到写成论文、实验上严格证明出来。起点是空白，终点是一个可被复现的原理验证。</p><p>这个阶段的核心问题是“这事能不能成”。做这件事的人需要容忍模糊、不怕试错、有点叛逆。让他们去搞流程管理或者跑渠道推广，基本是折磨。</p><h2 id="1→99"><a href="#1→99" class="headerlink" title="1→99"></a>1→99</h2><p>原理有了，但还不稳定、不靠谱。1→99就是把它变成稳定、可规模化、可交付的东西。对一首歌来说，是编曲、录音、混音、母带。对一项技术来说，是把实验室里动不动就坏的原型变成一条能稳定运行的生产线。</p><p>这个阶段的核心问题是“怎么能一直稳定地做成”。需要的是系统思维、耐心、项目管理能力。数字“1到99”只是个代号，不代表具体的进度值。</p><h2 id="99→100"><a href="#99→100" class="headerlink" title="99→100"></a>99→100</h2><p>这是最容易被误解的一段。99→100不是把产品做到完美无瑕，而是让需要它的人能够通过便捷的渠道轻易找到并使用。</p><p>拿音乐举例。灵感是0→1，编曲制作是1→99。一首歌做完锁在硬盘里，永远到不了100。上了流媒体、进了歌单、能被抖音刷到、在街上也能无意听到——这才算到了100。不是说每个人都得喜欢它，而是想听的人不费劲就能听到。</p><p>很多好东西死在这个阶段，不是因为不够好，而是别人找不到、用不上。</p><h2 id="三个阶段的区别"><a href="#三个阶段的区别" class="headerlink" title="三个阶段的区别"></a>三个阶段的区别</h2><table><thead><tr><th></th><th>0→1</th><th>1→99</th><th>99→100</th></tr></thead><tbody><tr><td>核心问题</td><td>能不能做成？</td><td>怎么能稳定做成？</td><td>怎么能让人轻易用到？</td></tr><tr><td>典型行动</td><td>试错、质疑、实验</td><td>优化、标准化、流程化</td><td>渠道、降低门槛、用户触达</td></tr><tr><td>所需能力</td><td>发散、容忍模糊</td><td>系统思维、耐心</td><td>用户洞察、沟通、运营</td></tr></tbody></table><h2 id="关于分工"><a href="#关于分工" class="headerlink" title="关于分工"></a>关于分工</h2><p>一个人不适合同时做三个阶段。不是绝对不行，而是人的精力、性格、能力天然冲突。让一个0→1型的科研人员去跑渠道做推广，消耗的是他的才气。反过来，让一个99→100型的运营去决定核心技术路线，也大概率翻车。</p><p>一个人最多擅长相邻的两个阶段。正常情况，专注一个阶段就够了。如果你发现自己想包揽三段，可能是在勉强自己。</p><h2 id="串行还是并行"><a href="#串行还是并行" class="headerlink" title="串行还是并行"></a>串行还是并行</h2><p>理论上三段是串行的：先0→1，再1→99，最后99→100。实际中你会发现，在1→99时可能发现当初那个0→1是错的，那就退回去重新找一个对的0→1。这不破坏三段本身的划分。</p><p>同一段时间里，你也可以今天做0→1的事，明天做1→99的事。关键是你清楚自己做的每一件事属于哪一类。</p><h2 id="这是个认知工具，不是物理定律"><a href="#这是个认知工具，不是物理定律" class="headerlink" title="这是个认知工具，不是物理定律"></a>这是个认知工具，不是物理定律</h2><p>别拿它去跟现实死磕。纯数学没有“大众用户”的概念，那就只取前两段用。独立开发者同时写新算法、重构代码、发推特，你看他做的那件事的本质属于哪一类就行，不用按时间比例算。</p><p>不同人对同一件事的归类可以不同。这本来就是帮你理解自己工作的，不需要外部证明。</p><h2 id="有什么用"><a href="#有什么用" class="headerlink" title="有什么用"></a>有什么用</h2><p>这套东西帮我回答过几个实际问题：</p><ul><li>我现在卡在哪了？——有时候发现不是自己能力不行，而是这个阶段本身就烦人。</li><li>我需要什么样的人合作？——如果我在做0→1，就别找一个满脑子流程优化的工程师来管我。</li><li>我是不是在强迫自己做不适合的事？——一个0→1型的人被逼着做99→100，会痛苦而且做不好。</li></ul><p>如果你用着也觉得顺手，就拿去用。如果觉得哪里不对，就按你自己的改。</p>]]>
    </content>
    <id>https://boywuxu.github.io/2026/04/04/%E4%B8%89%E5%88%86%E7%B1%BB%E7%90%86%E8%AE%BA/</id>
    <link href="https://boywuxu.github.io/2026/04/04/%E4%B8%89%E5%88%86%E7%B1%BB%E7%90%86%E8%AE%BA/"/>
    <published>2026-04-03T16:48:27.000Z</published>
    <summary>
      <![CDATA[<h1 id="三段创造"><a href="#三段创造" class="headerlink" title="三段创造"></a>三段创造</h1><p>我发现任何有点难度的工作，尤其是科研或高科技领域，都能分成三个阶段：0→1、1→99、99→100。这不是什么严谨的理论，就是个帮我自己理解世界的框架。</p>
<h2 id="0→1"><a href="#0→1" class="headerlink" title="0→1"></a>0→1</h2><p>从学术上没人提过的想法，到写成论文、实验上严格证明出来。起点是空白，终点是一个可被复现的原理验证。</p>
<p>这个阶段的核心问题是“这事能不能成”。做这件事的人需要容忍模糊、不怕试错、有点叛逆。让他们去搞流程管理或者跑渠道推广，基本是折磨。</p>
<h2 id="1→99"><a href="#1→99" class="headerlink" title="1→99"></a>1→99</h2><p>原理有了，但还不稳定、不靠谱。1→99就是把它变成稳定、可规模化、可交付的东西。对一首歌来说，是编曲、录音、混音、母带。对一项技术来说，是把实验室里动不动就坏的原型变成一条能稳定运行的生产线。</p>
<p>这个阶段的核心问题是“怎么能一直稳定地做成”。需要的是系统思维、耐心、项目管理能力。数字“1到99”只是个代号，不代表具体的进度值。</p>
<h2 id="99→100"><a href="#99→100" class="headerlink" title="99→100"></a>99→100</h2><p>这是最容易被误解的一段。99→100不是把产品做到完美无瑕，而是让需要它的人能够通过便捷的渠道轻易找到并使用。</p>]]>
    </summary>
    <title>三分类理论</title>
    <updated>2026-04-03T16:48:33.984Z</updated>
  </entry>
  <entry>
    <author>
      <name>无序</name>
    </author>
    <content>
      <![CDATA[<h1 id="Automatic-Fortran-to-C-conversion"><a href="#Automatic-Fortran-to-C-conversion" class="headerlink" title="Automatic Fortran to C++ conversion"></a>Automatic Fortran to C++ conversion</h1><h2 id="1-安装fable环境"><a href="#1-安装fable环境" class="headerlink" title="1. 安装fable环境"></a>1. 安装fable环境</h2><h3 id="Pre-requisites"><a href="#Pre-requisites" class="headerlink" title="Pre-requisites:"></a>Pre-requisites:</h3><ol><li><p>Please have a Linux environment, bash shell.</p></li><li><p>Please create a working directory </p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> WORK=&lt;new working directory&gt;</span><br><span class="line"><span class="built_in">cd</span> <span class="variable">$&#123;WORK&#125;</span></span><br></pre></td></tr></table></figure></li><li><p>Download source code:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">wget https://raw.githubusercontent.com/cctbx/cctbx_project/master/libtbx/auto_build/bootstrap.py --no-check-certificate</span><br><span class="line">python bootstrap.py hot update --builder=cctbx</span><br></pre></td></tr></table></figure></li></ol><h3 id="Create-and-configure-a-conda-environment"><a href="#Create-and-configure-a-conda-environment" class="headerlink" title="Create and configure a conda environment:"></a>Create and configure a conda environment:</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">wget https://repo.continuum.io/miniconda/Miniconda2-latest-Linux-x86_64.sh --no-check-certificate</span><br><span class="line"><span class="built_in">chmod</span> u+x Miniconda2-latest-Linux-x86_64.sh</span><br><span class="line">./Miniconda2-latest-Linux-x86_64.sh <span class="comment"># tested with conda 4.5.11</span></span><br><span class="line">     <span class="comment"># please install in directory $&#123;WORK&#125;/miniconda2</span></span><br><span class="line">     <span class="comment"># no, do not prepend Miniconda2 to .bashrc</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">source</span> miniconda2/etc/profile.d/conda.sh</span><br><span class="line">conda create -y --name fable36 python=3.6</span><br><span class="line">conda activate fable36</span><br><span class="line">conda install six future</span><br></pre></td></tr></table></figure><h3 id="Create-and-configure-FABLE"><a href="#Create-and-configure-FABLE" class="headerlink" title="Create and configure FABLE:"></a>Create and configure FABLE:</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> build36</span><br><span class="line"><span class="built_in">cd</span> <span class="variable">$&#123;WORK&#125;</span>/build36</span><br><span class="line">python ../modules/cctbx_project/libtbx/configure.py fable</span><br><span class="line"><span class="comment"># python ../modules/cctbx_project/libtbx/configure.py --enable_cxx11 fable # support C++11 standard</span></span><br><span class="line"><span class="built_in">source</span> <span class="variable">$&#123;WORK&#125;</span>/build36/setpaths.sh</span><br><span class="line"><span class="built_in">cd</span> <span class="variable">$&#123;WORK&#125;</span>/build36; make; <span class="built_in">cd</span> <span class="variable">$&#123;WORK&#125;</span></span><br><span class="line"><span class="built_in">cd</span> <span class="variable">$&#123;WORK&#125;</span>/build36; make; <span class="built_in">cd</span> <span class="variable">$&#123;WORK&#125;</span></span><br></pre></td></tr></table></figure><h3 id="Test-FABLE-in-a-new-login-shell-bash-cd-WORK"><a href="#Test-FABLE-in-a-new-login-shell-bash-cd-WORK" class="headerlink" title="Test FABLE in a new login shell (bash, cd ${WORK}):"></a>Test FABLE in a new login shell (bash, cd ${WORK}):</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> miniconda2/etc/profile.d/conda.sh</span><br><span class="line">conda activate fable36</span><br><span class="line"><span class="built_in">source</span> <span class="variable">$&#123;WORK&#125;</span>/build36/setpaths.sh</span><br><span class="line"><span class="built_in">mkdir</span> test36; <span class="built_in">cd</span> test36</span><br><span class="line">libtbx.run_tests_parallel module=fable <span class="built_in">nproc</span>=Auto</span><br></pre></td></tr></table></figure><blockquote><p>  [!NOTE]</p><p>  Not yet tested with MacOSX</p><p>  Also works with Python 2.7 (change 3.6 to 2.7)</p></blockquote><h2 id="2-使用fable"><a href="#2-使用fable" class="headerlink" title="2. 使用fable"></a>2. <a href="https://cci.lbl.gov/fable/">使用fable</a></h2><blockquote><p>  [!IMPORTANT]</p><p>  fable comes with the C++ <strong>fem</strong> Fortran EMulation library. The entire fem library is inlined and therefore very easy to use: simply add <code>-I/actual/path/fable</code> or similar to the compilation command.</p></blockquote><p>先启动上面创建好的python环境</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> miniconda2/etc/profile.d/conda.sh</span><br><span class="line">conda activate fable36</span><br><span class="line"><span class="built_in">source</span> <span class="variable">$&#123;WORK&#125;</span>/build36/setpaths.sh</span><br></pre></td></tr></table></figure><p>之后开始转换代码</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">fable.cout your_fortran_code.f --namespace=example &gt; example.cpp</span><br></pre></td></tr></table></figure><p>编译新生成的C++代码</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">g++ example.cpp -I <span class="variable">$&#123;WORK&#125;</span>/fable -I <span class="variable">$&#123;WORK&#125;</span>/fable/modules/cctbx_project</span><br></pre></td></tr></table></figure><blockquote><p>  [!NOTE]</p><p>  其他问题可以参阅 <a href="https://cci.lbl.gov/fable/">https://cci.lbl.gov/fable/</a></p></blockquote>]]>
    </content>
    <id>https://boywuxu.github.io/2026/04/01/fotran2cpp/</id>
    <link href="https://boywuxu.github.io/2026/04/01/fotran2cpp/"/>
    <published>2026-03-31T16:00:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="Automatic-Fortran-to-C-conversion"><a href="#Automatic-Fortran-to-C-conversion" class="headerlink" title="Automatic Fortran to C++ conversion"></a>Automatic Fortran to C++ conversion</h1><h2 id="1-安装fable环境"><a href="#1-安装fable环境" class="headerlink" title="1. 安装fable环境"></a>1. 安装fable环境</h2><h3 id="Pre-requisites"><a href="#Pre-requisites" class="headerlink" title="Pre-requisites:"></a>Pre-requisites:</h3><ol>
<li><p>Please have a Linux environment, bash shell.</p>
</li>
<li><p>Please create a working directory </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> WORK=&lt;new working directory&gt;</span><br><span class="line"><span class="built_in">cd</span> <span class="variable">$&#123;WORK&#125;</span></span><br></pre></td></tr></table></figure>
</li>
<li><p>Download source code:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">wget https://raw.githubusercontent.com/cctbx/cctbx_project/master/libtbx/auto_build/bootstrap.py --no-check-certificate</span><br><span class="line">python bootstrap.py hot update --builder=cctbx</span><br></pre></td></tr></table></figure></li>
</ol>
<h3 id="Create-and-configure-a-conda-environment"><a href="#Create-and-configure-a-conda-environment" class="headerlink" title="Create and configure a conda environment:"></a>Create and configure a conda environment:</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">wget https://repo.continuum.io/miniconda/Miniconda2-latest-Linux-x86_64.sh --no-check-certificate</span><br><span class="line"><span class="built_in">chmod</span> u+x Miniconda2-latest-Linux-x86_64.sh</span><br><span class="line">./Miniconda2-latest-Linux-x86_64.sh <span class="comment"># tested with conda 4.5.11</span></span><br><span class="line">     <span class="comment"># please install in directory $&#123;WORK&#125;/miniconda2</span></span><br><span class="line">     <span class="comment"># no, do not prepend Miniconda2 to .bashrc</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">source</span> miniconda2/etc/profile.d/conda.sh</span><br><span class="line">conda create -y --name fable36 python=3.6</span><br><span class="line">conda activate fable36</span><br><span class="line">conda install six future</span><br></pre></td></tr></table></figure>

<h3 id="Create-and-configure-FABLE"><a href="#Create-and-configure-FABLE" class="headerlink" title="Create and configure FABLE:"></a>Create and configure FABLE:</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> build36</span><br><span class="line"><span class="built_in">cd</span> <span class="variable">$&#123;WORK&#125;</span>/build36</span><br><span class="line">python ../modules/cctbx_project/libtbx/configure.py fable</span><br><span class="line"><span class="comment"># python ../modules/cctbx_project/libtbx/configure.py --enable_cxx11 fable # support C++11 standard</span></span><br><span class="line"><span class="built_in">source</span> <span class="variable">$&#123;WORK&#125;</span>/build36/setpaths.sh</span><br><span class="line"><span class="built_in">cd</span> <span class="variable">$&#123;WORK&#125;</span>/build36; make; <span class="built_in">cd</span> <span class="variable">$&#123;WORK&#125;</span></span><br><span class="line"><span class="built_in">cd</span> <span class="variable">$&#123;WORK&#125;</span>/build36; make; <span class="built_in">cd</span> <span class="variable">$&#123;WORK&#125;</span></span><br></pre></td></tr></table></figure>

<h3 id="Test-FABLE-in-a-new-login-shell-bash-cd-WORK"><a href="#Test-FABLE-in-a-new-login-shell-bash-cd-WORK" class="headerlink" title="Test FABLE in a new login shell (bash, cd ${WORK}):"></a>Test FABLE in a new login shell (bash, cd ${WORK}):</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> miniconda2/etc/profile.d/conda.sh</span><br><span class="line">conda activate fable36</span><br><span class="line"><span class="built_in">source</span> <span class="variable">$&#123;WORK&#125;</span>/build36/setpaths.sh</span><br><span class="line"><span class="built_in">mkdir</span> test36; <span class="built_in">cd</span> test36</span><br><span class="line">libtbx.run_tests_parallel module=fable <span class="built_in">nproc</span>=Auto</span><br></pre></td></tr></table></figure>]]>
    </summary>
    <title>fotran2cpp</title>
    <updated>2026-04-01T07:44:55.004Z</updated>
  </entry>
  <entry>
    <author>
      <name>无序</name>
    </author>
    <content>
      <![CDATA[<h1 id="断网-GPU-服务器使用-Claude-Code-指南"><a href="#断网-GPU-服务器使用-Claude-Code-指南" class="headerlink" title="断网 GPU 服务器使用 Claude Code 指南"></a>断网 GPU 服务器使用 Claude Code 指南</h1><blockquote><p>适用场景：本地 macOS + SSH 密码登录 + 服务器完全断网</p></blockquote><h2 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">服务器 → SSH 反向隧道 → 本地电脑（Clash/pproxy）→ 互联网 → Anthropic API</span><br></pre></td></tr></table></figure><hr><h2 id="方案选择"><a href="#方案选择" class="headerlink" title="方案选择"></a>方案选择</h2><table><thead><tr><th>场景</th><th>推荐方案</th></tr></thead><tbody><tr><td>本地使用 Clash 代理上网</td><td><strong>方案一：直接转发 Clash 端口</strong>（推荐）</td></tr><tr><td>本地直连外网，无代理工具</td><td><strong>方案二：pproxy 自建代理</strong></td></tr></tbody></table><hr><h2 id="方案一：转发-Clash-端口（推荐）"><a href="#方案一：转发-Clash-端口（推荐）" class="headerlink" title="方案一：转发 Clash 端口（推荐）"></a>方案一：转发 Clash 端口（推荐）</h2><p>如果本地使用 Clash&#x2F;Clashy 上网，直接把 Clash 的代理端口通过 SSH 隧道转发给服务器，流量完全走 Clash 的规则，VPN 分流等策略全部生效。</p><h3 id="第一步：确认-Clash-代理端口"><a href="#第一步：确认-Clash-代理端口" class="headerlink" title="第一步：确认 Clash 代理端口"></a>第一步：确认 Clash 代理端口</h3><p>在 Clashy 界面查看 HTTP 代理端口，默认为 <code>7890</code>。</p><h3 id="第二步：建立-SSH-反向隧道（终端1）"><a href="#第二步：建立-SSH-反向隧道（终端1）" class="headerlink" title="第二步：建立 SSH 反向隧道（终端1）"></a>第二步：建立 SSH 反向隧道（终端1）</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh -R 2081:localhost:7890 -N -p 30513 root@10.8.128.123</span><br></pre></td></tr></table></figure><p>替换 <code>30513</code>、<code>root</code>、<code>10.8.128.123</code> 为你自己的 SSH 端口、用户名、服务器 IP。</p><blockquote><p>⚠️ 输入密码后无任何输出属于正常现象，此终端保持运行，不要关闭。</p></blockquote><h3 id="第三步：SSH-登录服务器并设置代理（终端2）"><a href="#第三步：SSH-登录服务器并设置代理（终端2）" class="headerlink" title="第三步：SSH 登录服务器并设置代理（终端2）"></a>第三步：SSH 登录服务器并设置代理（终端2）</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh root@10.8.128.123 -p 30513</span><br></pre></td></tr></table></figure><p>登录后设置代理环境变量：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> HTTP_PROXY=http://127.0.0.1:2081</span><br><span class="line"><span class="built_in">export</span> HTTPS_PROXY=http://127.0.0.1:2081</span><br><span class="line"><span class="built_in">export</span> ALL_PROXY=http://127.0.0.1:2081</span><br></pre></td></tr></table></figure><blockquote><p>💡 可以把这三行写入 <code>~/.bashrc</code>，之后每次登录自动生效。</p></blockquote><h3 id="第四步：验证网络连通性"><a href="#第四步：验证网络连通性" class="headerlink" title="第四步：验证网络连通性"></a>第四步：验证网络连通性</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl --proxy http://127.0.0.1:2081 https://ifconfig.me</span><br></pre></td></tr></table></figure><p>返回的 IP 与本地 Clash 出口 IP 一致即表示成功。</p><h3 id="第五步：安装并运行-Claude-Code"><a href="#第五步：安装并运行-Claude-Code" class="headerlink" title="第五步：安装并运行 Claude Code"></a>第五步：安装并运行 Claude Code</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install -g @anthropic-ai/claude-code</span><br><span class="line">claude</span><br></pre></td></tr></table></figure><hr><h2 id="方案二：pproxy-自建代理"><a href="#方案二：pproxy-自建代理" class="headerlink" title="方案二：pproxy 自建代理"></a>方案二：pproxy 自建代理</h2><p>如果本地没有 Clash，用 pproxy 在本地起一个代理。</p><h3 id="第一步：本地安装并启动-pproxy（终端1）"><a href="#第一步：本地安装并启动-pproxy（终端1）" class="headerlink" title="第一步：本地安装并启动 pproxy（终端1）"></a>第一步：本地安装并启动 pproxy（终端1）</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pip3 install pproxy</span><br><span class="line">python3 -m pproxy -l socks5://0.0.0.0:1080 -l http://0.0.0.0:1081</span><br></pre></td></tr></table></figure><blockquote><p>⚠️ 此终端保持运行，不要关闭。</p></blockquote><h3 id="第二步：建立-SSH-反向隧道（终端2）"><a href="#第二步：建立-SSH-反向隧道（终端2）" class="headerlink" title="第二步：建立 SSH 反向隧道（终端2）"></a>第二步：建立 SSH 反向隧道（终端2）</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh -R 2080:localhost:1080 -R 2081:localhost:1081 -N -p 30513 root@10.8.128.123</span><br></pre></td></tr></table></figure><blockquote><p>⚠️ 输入密码后无任何输出属于正常现象，此终端同样保持运行。</p></blockquote><h3 id="第三步：SSH-登录服务器并设置代理（终端3）"><a href="#第三步：SSH-登录服务器并设置代理（终端3）" class="headerlink" title="第三步：SSH 登录服务器并设置代理（终端3）"></a>第三步：SSH 登录服务器并设置代理（终端3）</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh root@10.8.128.123 -p 30513</span><br></pre></td></tr></table></figure><p>登录后设置代理环境变量：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> HTTP_PROXY=http://127.0.0.1:2081</span><br><span class="line"><span class="built_in">export</span> HTTPS_PROXY=http://127.0.0.1:2081</span><br><span class="line"><span class="built_in">export</span> ALL_PROXY=http://127.0.0.1:2081</span><br></pre></td></tr></table></figure><h3 id="第四步：验证网络连通性-1"><a href="#第四步：验证网络连通性-1" class="headerlink" title="第四步：验证网络连通性"></a>第四步：验证网络连通性</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl --socks5-hostname 127.0.0.1:2080 https://ifconfig.me</span><br></pre></td></tr></table></figure><p>返回一个 IP 地址即表示成功。</p><h3 id="第五步：安装并运行-Claude-Code-1"><a href="#第五步：安装并运行-Claude-Code-1" class="headerlink" title="第五步：安装并运行 Claude Code"></a>第五步：安装并运行 Claude Code</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install -g @anthropic-ai/claude-code</span><br><span class="line">claude</span><br></pre></td></tr></table></figure><hr><h2 id="安装其他软件包"><a href="#安装其他软件包" class="headerlink" title="安装其他软件包"></a>安装其他软件包</h2><p>设置好环境变量后，pip、npm、claude 均可直接使用。apt 需一次性写入代理配置：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;Acquire::http::Proxy &quot;http://127.0.0.1:2081&quot;;&#x27;</span> &gt; /etc/apt/apt.conf.d/proxy.conf</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;Acquire::https::Proxy &quot;http://127.0.0.1:2081&quot;;&#x27;</span> &gt;&gt; /etc/apt/apt.conf.d/proxy.conf</span><br></pre></td></tr></table></figure><p>之后各工具直接使用：</p><table><thead><tr><th>工具</th><th>命令</th></tr></thead><tbody><tr><td>pip</td><td><code>pip install 包名</code></td></tr><tr><td>apt</td><td><code>apt install 包名</code></td></tr><tr><td>npm</td><td><code>npm install 包名</code></td></tr><tr><td>claude</td><td><code>claude</code></td></tr></tbody></table><hr><h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><table><thead><tr><th>错误信息</th><th>原因</th><th>解决方法</th></tr></thead><tbody><tr><td><code>connection to proxy closed</code></td><td>本地代理未启动</td><td>确认 pproxy 或 Clash 正在运行</td></tr><tr><td><code>Could not resolve host</code></td><td>DNS 未走代理</td><td>改用 <code>--proxy</code> 或 <code>--socks5-hostname</code> 参数</td></tr><tr><td><code>Protocol socks5h not supported</code></td><td>服务器 curl 版本太旧</td><td>改用 <code>--socks5-hostname</code> 参数</td></tr><tr><td><code>Missing dependencies for SOCKS</code></td><td>pip 缺少 SOCKS 支持</td><td>改用 HTTP 代理端口 2081</td></tr><tr><td><code>channel 2: open failed</code></td><td>GatewayPorts 未开启</td><td>服务器执行 <code>echo &quot;GatewayPorts yes&quot; &gt;&gt; /etc/ssh/sshd_config &amp;&amp; systemctl restart sshd</code></td></tr><tr><td>服务器能联网但未走 VPN</td><td>Clash 分流模式未覆盖 pproxy 流量</td><td>改用方案一直接转发 Clash 端口</td></tr></tbody></table>]]>
    </content>
    <id>https://boywuxu.github.io/2026/03/11/%E6%96%AD%E7%BD%91GPU%E6%9C%8D%E5%8A%A1%E5%99%A8Claude_Code%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97/</id>
    <link href="https://boywuxu.github.io/2026/03/11/%E6%96%AD%E7%BD%91GPU%E6%9C%8D%E5%8A%A1%E5%99%A8Claude_Code%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97/"/>
    <published>2026-03-11T07:50:17.000Z</published>
    <summary>
      <![CDATA[<h1 id="断网-GPU-服务器使用-Claude-Code-指南"><a href="#断网-GPU-服务器使用-Claude-Code-指南" class="headerlink" title="断网 GPU 服务器使用 Claude Code 指南"></a>断网 GPU 服务器使用 Claude Code 指南</h1><blockquote>
<p>适用场景：本地 macOS + SSH 密码登录 + 服务器完全断网</p>
</blockquote>
<h2 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">服务器 → SSH 反向隧道 → 本地电脑（Clash/pproxy）→ 互联网 → Anthropic API</span><br></pre></td></tr></table></figure>

<hr>
<h2 id="方案选择"><a href="#方案选择" class="headerlink" title="方案选择"></a>方案选择</h2><table>
<thead>
<tr>
<th>场景</th>
<th>推荐方案</th>
</tr>
</thead>
<tbody><tr>
<td>本地使用 Clash 代理上网</td>
<td><strong>方案一：直接转发 Clash 端口</strong>（推荐）</td>
</tr>
<tr>
<td>本地直连外网，无代理工具</td>
<td><strong>方案二：pproxy 自建代理</strong></td>
</tr>
</tbody></table>
<hr>
<h2 id="方案一：转发-Clash-端口（推荐）"><a href="#方案一：转发-Clash-端口（推荐）" class="headerlink" title="方案一：转发 Clash 端口（推荐）"></a>方案一：转发 Clash 端口（推荐）</h2><p>如果本地使用 Clash&#x2F;Clashy 上网，直接把 Clash 的代理端口通过 SSH 隧道转发给服务器，流量完全走 Clash 的规则，VPN 分流等策略全部生效。</p>]]>
    </summary>
    <title>断网GPU服务器Claude_Code配置指南</title>
    <updated>2026-04-01T15:39:35.793Z</updated>
  </entry>
  <entry>
    <author>
      <name>无序</name>
    </author>
    <content>
      <![CDATA[<p>曾经沧海难为水，除却巫山不是云</p><p>终有弱水替沧海，再无相思寄巫山</p><p>深爱之人藏心不挂嘴，久爱之人在梦不在眼</p><p>相遇就像你特别喜欢可乐，喝的时候爽到了就是意义；重点不是结局在不在一起，而是共同创造了独属于你们的时间线。</p><p>“如果有一天我不来找你，你会怎么办？”<br>    “我会试着不期望你来。”</p><p>他说:<br>    “九叶重楼二两，<br>    冬至蝉蜕一钱。<br>    煎入隔年雪煮沸，<br>    可医世人相思疾苦。”<br>    我又问:<br>    “可重楼七叶一花，<br>    冬日何来蝉蜕<br>    雪又怎能隔年<br>    相思又怎可解。”<br>    大夫说:<br>    “孰不知，夏枯即为九重楼，<br>    掘地三尺寒蝉现，<br>    除夕子时雪，落地已隔年，<br>    过了离别时，相思亦可解！”<br>    ——<br>    吾悲叹:“可奈何，<br>    夏枯辛苦深寒，<br>    寒蝉体小声微，<br>    面拂寒夜风，隔年雪冻人。<br>    相思虽可解，但寒苦卑弥已入喉，肠已断，泪难收，回首白头亦乃无解。”</p><p>没有什么一成不变，要学着允许一切发生。</p><p>当你凌晨睡不着 突然意识到自己曾经最想共度一生的人 居然变成了人生中的一个教训时</p><p>你根本没做错什么   我们都一样  爱就是会消散</p><p>“她满脸厌恶的求我放过她，我忽然愣住了，想起很久以前她小心翼翼的问我，你会离开我吗”</p><p>爱情不是一个强烈的感觉, 你以为我fall in love, 那个人, 我对他朝思暮想, 盘踞我的脑海, 盘踞我的心灵, 然后呢昼思夜想, 你觉得你这个叫做爱, 我错了, 爱不是感觉, 爱是一种意志, 是一种许诺, 因此他跟你的人格息息相关, 也因此爱必须经过学习</p><p>你要光靠感觉去维系爱情, 注定失败, 你对于你喜欢的对象, 你其实应该可以学习, 慢慢的客观的真正的去了解他, 而不是一定要他改头换面, 变成你喜欢的样子, 你才要爱他, 那这种爱都是这就不是真正的爱, 因为你只是爱上你自己的投影, 邻人之间也一样好, 等到发现什么, 你不是我想象中的样子好, 就是say goodbye</p><p>因为误会而结合, 然后因为了解而分开, 为什么我们总是落入这样这样的苛臼里面, 就应该要照他原来的样子去接受它</p><p>那我们现代人向往的一种爱情形态, 就是一见钟情, 因为我们相信直觉, 我们相信直觉超越了任何的永恒量, 超越了很多的思考, 强大的一种感性所选择的那个对象, 我你们觉得这才是最纯粹, 最没有任何杂质的一种爱情, 真的是这样吗, 有太多的形态是因为物误会而结合, 因为了解而分开, 一见钟情的情强度固然让我们感到一种震撼, 但是震撼过后请恢复理性, 你要追求的是终其一生, 细水长流的真实的爱情好</p><p>所以所谓的love就是你的心灵状态, 它不应该涉及到任何其他欲望的成分, 欲望就是欲望, 爱就是爱</p><p>可是婚姻是生活, 不是只有爱就能够支撑, 你要光靠感觉去维系爱情哦, 注定失败了, 爱情没有你所想象的可以那样子, 无坚不摧, 我们这个时代的好处在于说, 就因为这个对象是我选的, 所以以后不管信或不信人, 一定要学会自己去对你的人生做出选择, 然后选择你所爱的, 接下来也学习爱你所选择的欢乐的全都有</p><p>你应该是先建立一个深刻的相互的了解, 甚至彼此有共同的兴趣, 因此将来可以无限的延伸, 然后结了婚之后, 那就是一种意志跟承诺, 在这个意志跟承诺之下, 创造性的态度转向对方, 我可以帮助你配合你, 同样的, 当双方都是这样想的时候, 他们的情感就会越来越深厚</p><p>爱不只是说很强烈的吸引而已, 强烈的东西它会消退的, 会弱化的, 可是当你这个爱里面, 结合了NE的时候, 你会感谢对方对你的好, 你会愿意付出, 你不会觉得这个付出是一种压力, 所以我也应该对你好, 这是人跟人之间最好的一种互动, 通过对对方的爱好, 你因此也爱世界, 也爱自己</p><p>爱情应该就是要跟品德人格结合在一起的, 每一个人必须审视自己, 交给自己生命的意义, 有些东西并非需要发现, 而是必须加以铸造</p><p>你在后天去思考, 做一个人怎样才有价值, 于是你认识到这个价值之后, 你去打造你的性格, 所以性格是千锤百炼出来的, 是在你在一个价值的领导之下去努力追寻的, 它不是唾手可得, 不是只要你的生命, 你的自然是什么样子就可以得到的, 当你在铸造生命的意义的时候, 你甚至很有可能是在违背你的生理, 跟你的本能的那个程序</p><p>好看的外表是上天慷慨给予的礼物, 我们应该感谢并且珍惜, 但是绝对不应该把这份礼物变成是, 潘朵拉的盒子, 在华丽的表面下装满丑陋的欲望, 那就算是金玉其外, 败絮其中了, 长得好看的人未必就会风流花心, 而外表老实的人也很可能一肚子坏水, 人不可貌相, 有一句谚语说, Beauty is only in deep, 美丽呀只是一张皮肤的程度, 这等于中国人所说的肤浅, 看穿美貌的浅薄与虚假, 而守住珍贵的灵魂, 年华易逝, 所谓的红颜弹指老, 刹那芳华, 他只不过是很短暂的梦幻泡影而已, 而一旦内在装的是败絮, 那么这个人其实连毁灭也就不远了, 一个人最重要的是真心, 外表只不过是一张薄薄的皮而已, 看透它吧, 你反而能够得到真实而美好的人生</p><p>当时我们都太年轻了，还不懂得如何去爱</p><p>无论我们最后生疏成什么样子，曾经对你的好都是真的。就算终有一散，也别辜负相遇。希望你不后悔认识我，也是真的快乐过。如果能回到从前，我会选择不认识你，不是我后悔，是我不能面对现在的结局</p><p>“只要你观察一个人足够仔细，就会爱上这个人”</p><p>红酥手，黄縢酒，满城春色宫墙柳。东风恶，欢情薄。一怀愁绪，几年离索。错、错、错。</p><p>春如旧，人空瘦，泪痕红浥鲛绡透。桃花落，闲池阁。山盟虽在，锦书难托。莫、莫、莫！</p><p>世情薄，人情恶，雨送黄昏花易落。晓风干，泪痕残，欲笺心事，独语斜阑。难，难，难！</p><p>人成各，今非昨，病魂常似秋千索。角声寒，夜阑珊，怕人寻问，咽泪装欢。瞒，瞒，瞒！</p>]]>
    </content>
    <id>https://boywuxu.github.io/2025/02/21/%E5%A4%B1%E6%81%8B%E5%92%8C%E7%88%B1%E6%83%85/</id>
    <link href="https://boywuxu.github.io/2025/02/21/%E5%A4%B1%E6%81%8B%E5%92%8C%E7%88%B1%E6%83%85/"/>
    <published>2025-02-20T16:00:00.000Z</published>
    <summary>
      <![CDATA[<p>曾经沧海难为水，除却巫山不是云</p>
<p>终有弱水替沧海，再无相思寄巫山</p>
<p>深爱之人藏心不挂嘴，久爱之人在梦不在眼</p>
<p>相遇就像你特别喜欢可乐，喝的时候爽到了就是意义；重点不是结局在不在一起，而是共同创造了独属于你们的时间线。</p>
<p>“如果有一天我不来找你，你会怎么办？”<br>    “我会试着不期望你来。”</p>
<p>他说:<br>    “九叶重楼二两，<br>    冬至蝉蜕一钱。<br>    煎入隔年雪煮沸，<br>    可医世人相思疾苦。”<br>    我又问:<br>    “可重楼七叶一花，<br>    冬日何来蝉蜕<br>    雪又怎能隔年<br>    相思又怎可解。”<br>    大夫说:<br>    “孰不知，夏枯即为九重楼，<br>    掘地三尺寒蝉现，<br>    除夕子时雪，落地已隔年，<br>    过了离别时，相思亦可解！”<br>    ——<br>    吾悲叹:“可奈何，<br>    夏枯辛苦深寒，<br>    寒蝉体小声微，<br>    面拂寒夜风，隔年雪冻人。<br>    相思虽可解，但寒苦卑弥已入喉，肠已断，泪难收，回首白头亦乃无解。”</p>
<p>没有什么一成不变，要学着允许一切发生。</p>
<p>当你凌晨睡不着 突然意识到自己曾经最想共度一生的人 居然变成了人生中的一个教训时</p>
<p>你根本没做错什么   我们都一样  爱就是会消散</p>
<p>“她满脸厌恶的求我放过她，我忽然愣住了，想起很久以前她小心翼翼的问我，你会离开我吗”</p>]]>
    </summary>
    <title>失恋和爱情</title>
    <updated>2026-04-01T07:44:55.008Z</updated>
  </entry>
  <entry>
    <author>
      <name>无序</name>
    </author>
    <content>
      <![CDATA[<p><strong>一般来说，开发岗位的算法面试是不会出题要求面试者临时设计一个数据结构来解决某个问题，大多数时候只是要求面试者能够熟练掌握常见的数据结构及其实现、能够说出这种数据结构的优缺点即可。</strong></p><h1 id="大模型架构"><a href="#大模型架构" class="headerlink" title="大模型架构"></a>大模型架构</h1><h2 id="原始-Transformer"><a href="#原始-Transformer" class="headerlink" title="原始 Transformer"></a>原始 Transformer</h2><img src="/images/2-transformer.png" alt="transformer" style="zoom:50%;" /><h2 id="分词方式"><a href="#分词方式" class="headerlink" title="分词方式"></a>分词方式</h2><h3 id="字节对编码-BPE"><a href="#字节对编码-BPE" class="headerlink" title="字节对编码 BPE"></a>字节对编码 BPE</h3><p>本质上是subword作为词表，只不过是优先合并出现频率高的字符，直到词表大小合适或者最高词频为1</p><h2 id="注意力机制"><a href="#注意力机制" class="headerlink" title="注意力机制"></a>注意力机制</h2><h3 id="注意力评分函数"><a href="#注意力评分函数" class="headerlink" title="注意力评分函数"></a>注意力评分函数</h3><ul><li><p>加性注意力评分函数<br>$$<br>a(q,k)&#x3D;w^T_vtanh(W_qq+W_kk)<br>$$<br> 加性注意力评分函数可以看作，将查询和键连结起来后输入到一个多层感知机（MLP）中， 感知机包含一个隐藏层，其隐藏单元数是一个超参数ℎ。 通过使用tanh作为激活函数，并且禁用偏置项，</p></li><li><p>缩放点积注意力评分函数<br>$$<br>a(q,k)&#x3D;\frac{QK^T}{\sqrt{d}}<br>$$<br> 为确保无论向量长度如何， 点积的方差在不考虑向量长度的情况下仍然是1， 将点积除以$$\sqrt{d}$$</p></li></ul><p><strong>Summary:</strong></p><ol><li>加性注意力和缩放点积注意力计算复杂度接近，但矩阵乘法有非常成熟的加速实现，所以缩放点积注意力的计算效率更高。</li><li>在d(注意力矩阵的维度)较小时，加性和缩放点积注意力效果接近，但随着d的增大，加性注意力开始显著超越缩放点积。原因是极大的点积值将整个 softmax 推向梯度平缓区，使得收敛困难，所以缩放点积注意力需要除以$$\sqrt{d}$$。</li></ol><h3 id="多头注意力机制-MHA"><a href="#多头注意力机制-MHA" class="headerlink" title="多头注意力机制 MHA"></a>多头注意力机制 MHA</h3><p>QKV 三部分有相同数量的头，且一一对应。每次做 Attention，head_i 的 QKV 做好自己的运算就可以，输出时各个头加起来就行</p><h3 id="多查询注意力机制-MQA"><a href="#多查询注意力机制-MQA" class="headerlink" title="多查询注意力机制 MQA"></a>多查询注意力机制 MQA</h3><p>让 Q 仍然保持原来的头数，但 K 和 V 只有一个头，相当于所有的 Q 头共享一组 K 和 V 头，所以叫做 Multi-Query 了。</p><h3 id="分组查询注意力机制-GQA"><a href="#分组查询注意力机制-GQA" class="headerlink" title="分组查询注意力机制 GQA"></a>分组查询注意力机制 GQA</h3><p>是 MHA 和 MQA 的折衷方案，既不想损失性能太多，又想获得 MQA 带来的推理加速好处。具体思想：不是所有 Q 头共享一组 KV，而是进行分组，一定头数 Q 共享一组 KV<br>            <img src="/images/image-20250304220202678.png" alt="image-20250304220202678" style="zoom:50%;" /></p><h3 id="Multi-Head-Latent-Attention"><a href="#Multi-Head-Latent-Attention" class="headerlink" title="Multi-Head Latent Attention"></a>Multi-Head Latent Attention</h3><p>MLA是为了解决在推理时KV Cache占据空间过大的问题</p><img src="/images/image-20250306162758437.png" alt="image-20250306162758437" style="zoom:67%;" /><h2 id="Normalization"><a href="#Normalization" class="headerlink" title="Normalization"></a>Normalization</h2><ul><li><p>Batch Norm</p><p>同一个位置token下，同一批batch下不同条数据进行标准化</p></li><li><p>Layer Norm（pre Norm (用的更多，训练起来更方便，但是没有post Norm上限高)and post Norm）</p><p>同一条数据中，不同位置token进行标准化</p></li><li><p>RMS Norm</p><p>RMSNorm和LayerNorm的主要区别在于RMSNorm不需要同时计算均值和方差两个统计量，而<strong>只需要计算均方根 Root Mean Square 这一个统计量</strong>，RMS Norm认为，Layer Norm成功的原因是<code>re-scaling</code>，因为方差Var计算的过程中使用了均值Mean，因此RMS Norm不再使用均值Mean，而是构造了一个特殊的统计量<code>RMS</code>代替方差Var。</p></li></ul><p>为什么 LN 比 BN 更适用于 Transformer 类模型呢，这是因为 transformer 模型是基于相似度的，把序列中的每个 token 的特征向量进行归一化有利于模型学习语义，第一步调整均值方差时，相当于对把各个 token 的特征向量缩放到统一的尺度，第二步施加 $$\pmb{\gamma, \beta}$$ 时，相当于对所有 token 的特征向量进行了统一的 transfer，这不会破坏 token 特征向量间的相对角度，因此不会破坏学到的语义信息。与之相对的，BN 沿着特征维度进行归一化，这时对序列中各个 token 施加的 transfer 是不同的，破坏了 token 特征向量间的相对角度关系</p><p><strong>pre-norm 和 post-norm的区别</strong></p><p>pre-norm：训练更加稳定， 在训练稳定和收敛性方面有明显的优势</p><p>post-norm：训练不稳定，但是潜在效果会更好，<strong>对训练不稳定，梯度容易爆炸，学习率敏感，初始化权重敏感，收敛困难。好处是有潜在效果上的优</strong></p><h3 id="归一化-标准化-的概念区分"><a href="#归一化-标准化-的概念区分" class="headerlink" title="归一化 | 标准化 的概念区分"></a>归一化 | 标准化 的概念区分</h3><ul><li><p>归一化<br>$$<br>x’&#x3D;\frac {x-min(x)} {max(x)-min(x)}<br>$$</p></li><li><p>均值归一化<br>$$<br>x’&#x3D;\frac{x-mean(x)}{max(x)-min(x)}<br>$$</p></li><li><p>标准化<br>$$<br>x’&#x3D;\frac{x-mean(x)}{\sigma(x)}<br>$$</p></li><li><p>单位化<br>$$<br>x’&#x3D;\frac{x}{||x||}<br>$$</p></li></ul><h2 id="RoPE-位置编码"><a href="#RoPE-位置编码" class="headerlink" title="RoPE 位置编码"></a>RoPE 位置编码</h2><p>绝对位置编码</p><ul><li>训练式位置编码</li><li>sin位置编码</li></ul><p>绝对位置编码的缺陷在于无法长度外推</p><p>RoPE 是相对位置编码，本质上通过让高维向量旋转 的方式将相对位置信息加入到 词向量中，具体做法是词向量乘以一个旋转矩阵，旋转矩阵中有相对位置信息<br>$$<br>\begin{pmatrix}<br>\cos m\theta_0 &amp; -\sin m\theta_0 &amp; 0 &amp; 0 &amp; \cdots &amp; 0 &amp; 0 \<br>\sin m\theta_0 &amp; \cos m\theta_0 &amp; 0 &amp; 0 &amp; \cdots &amp; 0 &amp; 0 \<br>0 &amp; 0 &amp; \cos m\theta_1 &amp; -\sin m\theta_1 &amp; \cdots &amp; 0 &amp; 0 \<br>0 &amp; 0 &amp; \sin m\theta_1 &amp; \cos m\theta_1 &amp; \cdots &amp; 0 &amp; 0 \<br>\vdots &amp; \vdots &amp; \vdots &amp; \vdots &amp; \ddots &amp; \vdots &amp; \vdots \<br>0 &amp; 0 &amp; 0 &amp; 0 &amp; \cdots &amp; \cos m\theta_{d&#x2F;2-1} &amp; -\sin m\theta_{d&#x2F;2-1} \<br>0 &amp; 0 &amp; 0 &amp; 0 &amp; \cdots &amp; \sin m\theta_{d&#x2F;2-1} &amp; \cos m\theta_{d&#x2F;2-1}<br>\end{pmatrix}</p><p>\begin{pmatrix}<br>q_0 \<br>q_1 \<br>q_2 \<br>q_3 \<br>\vdots \<br>q_{d-2} \<br>q_{d-1}<br>\end{pmatrix}<br>$$</p><h2 id="激活函数"><a href="#激活函数" class="headerlink" title="激活函数"></a>激活函数</h2><h3 id="SoftMax"><a href="#SoftMax" class="headerlink" title="SoftMax"></a>SoftMax</h3><p>softmax一般用于多分类的结果，一般和one-hot的真实标签值配合使用，大多数用于网络的最后一层<br>$$<br>Softmax(X)&#x3D;\frac{e^x}{\sum_{j&#x3D;1}^ne^{x_j}}<br>$$</p><h3 id="Sigmoid"><a href="#Sigmoid" class="headerlink" title="Sigmoid"></a>Sigmoid</h3><p>sigmoid是原本一种隐层之间的激活函数，但是因为效果比其他激活函数差，目前一般也只会出现在二分类的输出层中，与0 1真实标签配合使用<br>$$<br>Sigmoid(x)&#x3D;\frac{1}{1+e^{-x}}<br>$$</p><h3 id="ReLU"><a href="#ReLU" class="headerlink" title="ReLU"></a>ReLU</h3><p>线性整流函数（ReLU函数）的特点：</p><ul><li>当输入为正时，不存在梯度饱和问题。</li><li>计算速度快得多。ReLU 函数中只存在线性关系，因此它的计算速度比Sigmoid函数和tanh函数更快。</li><li>Dead ReLU问题。当输入为负时，ReLU完全失效，在正向传播过程中，这不是问题。有些区域很敏感，有些则不敏感。但是在反向传播过程中，如果输入负数，则梯度将完全为零，Sigmoid函数和tanh函数也具有相同的问题</li><li>ReLU函数的输出为0或正数，这意味着ReLU函数不是以0为中心的函数。</li></ul><p>$$<br>ReLU(x)&#x3D;max(0,x)<br>$$</p><h3 id="Silu"><a href="#Silu" class="headerlink" title="Silu"></a>Silu</h3><p>$$<br>f(x)&#x3D;x\cdot\sigma(x)<br>$$</p><p>SwiGLU 激活函数是Shazeer 在文献中提出，并在PaLM等模中进行了广泛应用，并且取得了不错的效果，<strong>相较于ReLU 函数在大部分评测中都有不少提升</strong>。可以看做是平滑的ReLU激活函数。</p><h3 id="Tanh"><a href="#Tanh" class="headerlink" title="Tanh"></a>Tanh</h3><p>双曲正切函数是双曲函数的一种。双曲正切函数在数学语言上一般写作tanh ⁡ \tanhtanh。它解决了Sigmoid函数的不以0为中心输出问题，然而，梯度消失的问题和幂运算的问题仍然存在</p><p>$$<br>tanh(x)&#x3D;\frac{e^x-e^{-x}}{e^x+e^{-x}}<br>$$</p><h2 id="损失函数"><a href="#损失函数" class="headerlink" title="损失函数"></a>损失函数</h2><h3 id="KL散度"><a href="#KL散度" class="headerlink" title="KL散度"></a>KL散度</h3><p>KL散度度量的是同一个随机变量的两个单独分布之间的距离，而非针对不同随机变量的</p><h3 id="交叉熵损失函数"><a href="#交叉熵损失函数" class="headerlink" title="交叉熵损失函数"></a>交叉熵损失函数</h3><p><strong>分类为什么用交叉熵而不用MSE？</strong></p><p>MSE作为损失函数有梯度消失的问题</p><p><strong>L1和L2正则化约束</strong></p><p>L1是参数绝对值之和加到loss上，L2是平方和加到loss上</p><h2 id="优化器"><a href="#优化器" class="headerlink" title="优化器"></a>优化器</h2><h3 id="Adam"><a href="#Adam" class="headerlink" title="Adam"></a>Adam</h3><h3 id="SGD"><a href="#SGD" class="headerlink" title="SGD"></a>SGD</h3><h2 id="文本大模型"><a href="#文本大模型" class="headerlink" title="文本大模型"></a>文本大模型</h2><h3 id="Llama3-架构"><a href="#Llama3-架构" class="headerlink" title="Llama3 架构"></a>Llama3 架构</h3><img src="/images/image-20250304160636510.png" alt="image-20250304160636510" style="zoom:67%;" /><p><strong>残差网络的优点：</strong></p><ol><li>防止梯度消失</li><li>特征重用</li><li>能够让模型的层数变得很多</li></ol><p><strong>为什么decoder only架构成为主流？</strong></p><p>首先淘汰encoder only的结构，因为masked language model预训练方式不擅长做生成任务</p><p>decoder only在工程上有更高的效率性，可以KV-cache，并且zero-shot的能力要更强</p><p>在理论上是因为Encoder的双向注意力会存在低秩问题，这可能会削弱模型表达能力，就生成任务而言，引入双向注意力并无实质好处。而Encoder-Decoder架构之所以能够在某些场景下表现更好，大概只是因为它多了一倍参数。所以，在同等参数量、同等推理成本下，Decoder-only架构就是最优选择了。</p><p><strong>FFN层为什么先升维再降维</strong></p><p>升维。其主要作用是拟合一个更高维的映射空间，从而提升模型的表达能力和拟合精度。</p><p>降维。其主要作用是还原维度，限制计算复杂度。</p><h2 id="多模态大模型"><a href="#多模态大模型" class="headerlink" title="多模态大模型"></a>多模态大模型</h2><h3 id="Vit架构"><a href="#Vit架构" class="headerlink" title="Vit架构"></a>Vit架构</h3><img src="/images/9482fd5a6332647be9f6110e909c0cd0.png" alt="ViT架构图" style="zoom:67%;" /><ol><li><strong>Patch Embedding的作用是将一个CV问题通过切块和展平转化为一个NLP问题</strong></li></ol><h3 id="总体架构"><a href="#总体架构" class="headerlink" title="总体架构"></a>总体架构</h3><img src="/images/image-20250304160716362.png" alt="image-20250304160716362" style="zoom:67%;" /><p>Vision Mapping 就是用图片token将 <image>占位符给替换掉</p><h2 id="MOE架构"><a href="#MOE架构" class="headerlink" title="MOE架构"></a>MOE架构</h2><img src="/images/image-20250304160656049.png" alt="image-20250304160656049" style="zoom:67%;" /><h3 id="Gate网络和专家选择机制"><a href="#Gate网络和专家选择机制" class="headerlink" title="Gate网络和专家选择机制"></a>Gate网络和专家选择机制</h3><ol><li><strong>计算匹配得分</strong><br>Gate 网络通过线性变换计算每个 token 与所有路由专家的兼容性得分。得分反映了 token 与各专家“契合”的程度。</li><li><strong>选择 Top-K 专家</strong><br>基于得分，Gate 网络为每个 token 选择 Top-K 个最合适的路由专家。在 DeepSeek‐V3 中，每个 token 通常选择 8 个路由专家（在一些实现中还可能对跨节点路由做限制，如最多路由到 4 个不同节点），从而只激活极少数专家进行计算。</li><li><strong>专家处理与加权聚合</strong><br>被选中的专家各自对 token 进行独立处理（一般采用一个轻量级的前馈网络，类似于 Transformer 中的 FFN 模块），产生各自的输出。最终，这些专家的输出会根据 Gate 网络给出的权重进行加权聚合，再与共享专家的输出进行融合，形成当前 MoE 层的最终输出表示。</li></ol><h1 id="大模型微调"><a href="#大模型微调" class="headerlink" title="大模型微调"></a>大模型微调</h1><h2 id="SFT微调算法"><a href="#SFT微调算法" class="headerlink" title="SFT微调算法"></a>SFT微调算法</h2><h3 id="LORA"><a href="#LORA" class="headerlink" title="LORA"></a>LORA</h3><p>A矩阵参数初始化为正态分布，B矩阵参数初始化为0</p><ul><li>如果B和A全部初始化为零矩阵，缺点是很容易导致梯度消失。</li><li>如果B和A全部正态分布初始化，那么在模型训练开始时，就会容易得到一个过大的偏移值△W,从而引起太多噪声，导致难以收敛。</li></ul><h3 id="QLORA"><a href="#QLORA" class="headerlink" title="QLORA"></a>QLORA</h3><p>在反向传播过程中，QLoRA 将预训练的权重量化为 4-bit，并使用分页优化器来处理内存峰值。</p><h3 id="Prompt-Tuning"><a href="#Prompt-Tuning" class="headerlink" title="Prompt-Tuning"></a>Prompt-Tuning</h3><p>Prompt Tuning设计了一种prefix prompt方法，即在模型输入的token序列前添加前缀prompt token，而这个前缀prompt token的embedding是由网络学到。</p><p>Prompt Tuning可以看做token已经确定，但是embedding是可以学的。它相当于仅用prompt token的embedding去适应下游任务，相比手工设计或挑选prompt，它是一种Soft的prompt(软提示)，</p><h3 id="Prefix-tuning"><a href="#Prefix-tuning" class="headerlink" title="Prefix-tuning"></a>Prefix-tuning</h3><p>Prefix tuning为ll层的Transformer Layer的每层多头注意力的键和值都配置了可学习的prefix vectors.</p><p>Prefix-Tuning可以算是Promot Tuning的一个特例（Promot Tuning只在输入侧加入可学习的Prefix Prompt Token）</p><h3 id="P-Tuning"><a href="#P-Tuning" class="headerlink" title="P-Tuning"></a>P-Tuning</h3><ul><li>Prefix Tuning 是将额外的 embedding 加在开头，看起来更像是模仿 Instruction 指令；而 P-Tuning 的位置则不固定。</li><li>Prefix Tuning 通过在每个 Attention 层都加入 Prefix Embedding 来增加额外的参数，通过 MLP 来初始化；而 P-Tuning 只是在输入的时候加入 Embedding，并通过 LSTM+MLP 来初始化。</li></ul><h3 id="P-Tuning-V2"><a href="#P-Tuning-V2" class="headerlink" title="P-Tuning V2"></a>P-Tuning V2</h3><p>相比 Prompt Tuning 和 P-tuning 的方法， P-tuning v2 方法在多层加入了 Prompts tokens 作为输入</p><h3 id="Adapter-Tuning"><a href="#Adapter-Tuning" class="headerlink" title="Adapter Tuning"></a>Adapter Tuning</h3><p>Adapter Tuning试图在Transformer Layer的Self-Attetion+FFN之后插入一个先降维再升维的MLP（以及一层残差和LayerNormalization）来学习模型微调的知识。Adapter即插入的FF up + FF Down（其实就是一个MLP）</p><p><strong>缺点</strong>：需要修改原有模型结构，同时还会增加模型参数量。</p><h2 id="微调框架"><a href="#微调框架" class="headerlink" title="微调框架"></a>微调框架</h2><h3 id="Deepspeed"><a href="#Deepspeed" class="headerlink" title="Deepspeed"></a>Deepspeed</h3><p>显存&#x3D;模型参数+梯度+优化器状态+中间激活值</p><p>zero-0: 不采用任何内存优化方案，也就是普通DDP</p><p>zero-1：将optimer需要存储的值切分到各个显卡上</p><p>zero-2：将优化器状态和梯度都划分到不同的设备上</p><p>zero-3：将模型参数、优化器状态和梯度都分到不同设备上</p><img src="/images/v2-51a6660e548e05b0f06c56d5fab9f270_1440w.jpg" alt="img" style="zoom:67%;" /><h3 id="Megatron-LM"><a href="#Megatron-LM" class="headerlink" title="Megatron-LM"></a>Megatron-LM</h3><ol><li>数据并行</li><li>张量并行</li><li>流水线并行</li></ol><h2 id="大模型蒸馏"><a href="#大模型蒸馏" class="headerlink" title="大模型蒸馏"></a>大模型蒸馏</h2><h3 id="白盒蒸馏"><a href="#白盒蒸馏" class="headerlink" title="白盒蒸馏"></a>白盒蒸馏</h3><h3 id="黑盒蒸馏"><a href="#黑盒蒸馏" class="headerlink" title="黑盒蒸馏"></a>黑盒蒸馏</h3><h2 id="大模型强化学习微调"><a href="#大模型强化学习微调" class="headerlink" title="大模型强化学习微调"></a>大模型强化学习微调</h2><h3 id="为什么RLHF有效"><a href="#为什么RLHF有效" class="headerlink" title="为什么RLHF有效"></a>为什么RLHF有效</h3><ol><li>多样性假设：对于同一个指令或者问题，模型应该能够产生多种多样的答案，而不是仅仅局限于SFT数据中对应的那一句回答</li><li>负样本均衡问题：对于SFT阶段，所有的数据都是精挑细选的高质量数据，也就是所谓的正样本，而我们都知道，训练模型时正负样本均衡才更有助于模型的泛化性，而SFT阶段没有向模型展示过任何负样本，而RLHF允许我们向模型展示负样本</li><li>RLHF有助于解决模型幻觉</li></ol><h3 id="RLHF"><a href="#RLHF" class="headerlink" title="RLHF"></a>RLHF</h3><p>强化学习微调需要用到四个模型，Actor模型、Reference模型、Critic模型、Reward模型</p><p>其中Actor模型是要微调的大模型，Reference模型是参数冻结的Base大模型，与Actor模型初始参数相同，Critic模型是用来评估Actor模型生成回答的整体好坏性，Reward模型是用来产生即时奖励的模型，初始的Critic模型与Reward模型是同一个模型，只不过Critc模型会与Actor模型一起进行参数更新，而Ref模型和Reward模型的参数是全程冻结的，Ref模型参数冻结是因为需要Ref模型的输出来作为一个参考，防止Actor模型跑偏。Reward模型在人类偏好训练完成之后便保持了与人类偏好一致，所以参数不能更新，否则将无法使Actor模型的输出与人类偏好对齐。Critic模型输出的奖励值一开始与Rewar模型一致，但是Critic模型需要不断估计在不同状态下Actor模型输出的好坏，所以需要随着数据不断进行参数更新，使自身对价值的估计与状态相契合。</p><p>参数更新需要用到loss, Actor模型的loss来自于其他三个模型，首先Ref模型将提供一个限制Actor模型跑偏的loss,Reward模型将提供一个一个token生成时的即时奖励loss, Critic模型提供一个当前token生成对未来长远影响的loss,一共三个loss,组成Actor模型的最终loss。这个最终loss的最终目标是想要让Actor模型在生成的意思没有太大变化的同时，使用符合人类偏好的文字来表达。</p><h3 id="PPO"><a href="#PPO" class="headerlink" title="PPO"></a>PPO</h3><p>$$<br>Adv_{t} &#x3D; (R_{t} + \gamma * V_{t+1} - V_{t}) + \gamma * \lambda * Adv_{t+1}<br>$$</p><p>$$<br>\begin{array}{l}R_{t}&#x3D;-kl_{ctl} *\left(\log \frac{P\left(A_{t} \mid S_{t}\right)}{P_{\text {ref }}\left(A_{t} \mid S_{t}\right)}\right), t \neq T \ R_{t}&#x3D;-kl_{c t l} *\left(\log \frac{P\left(A_{t} \mid S_{t}\right)}{P_{\text {ref }}\left(A_{t} \mid S_{t}\right)}\right)+R_{t}, t&#x3D;T\end{array}.<br>$$</p><p>$$<br>KL[Actor(X) || Ref(X)] &#x3D; E_{x\sim Actor(x)}[log\frac{Actor(x)}{Ref(x)}] &#x3D; log probs - reflogprobs<br>$$</p><p>$$<br>actor_{loss} &#x3D;-\min \left(\operatorname{Adv} v_{t} * \frac{P\left(A_{t} \mid S_{t}\right)}{P_{\text {old }}\left(A_{t} \mid S_{t}\right)}, \operatorname{Adv} v_{t} * \operatorname{clip}\left(\frac{P\left(A_{t} \mid S_{t}\right)}{P_{\text {old }}\left(A_{t} \mid S_{t}\right)}, 0.8,1.2\right)\right)<br>$$</p><p>$$<br>Critic_{loss} &#x3D;\left(R_{t}+\gamma * V_{t+1}-V_{t}\right)^{2}<br>$$</p><h3 id="DPO"><a href="#DPO" class="headerlink" title="DPO"></a>DPO</h3><p>使用DPO数据，同一个问题，一个接受的答案，一个拒绝答案</p><p>DPO loss 计算：- Sigmoid（（Actor模型在接受答案的概率-Actor模型在拒绝答案上的概率）- （Ref模型在接受答案上的概率-Ref模型在拒绝答案上的概率））</p><p>或者可以说 （Actor模型在接受答案的概率-Ref模型在接受答案上的概率）- （Ref模型在拒绝答案上的概率-Actor模型在拒绝答案上的概率）</p><p>也就是说 loss 使得Actor模型的生成答案相比较于Ref模型 更靠近接受答案， 更远离拒绝答案</p><h3 id="GRPO"><a href="#GRPO" class="headerlink" title="GRPO"></a>GRPO</h3><p>不使用优势，采用多次采样，近似得到baseline</p><ol><li><p>为什么GRPO一开始loss为0？</p><p>一开始actor model 和ref model 的KL散度是0，在一开始时损失函数等于$\beta$倍的平均KL散度，所以loss一开始是0</p></li><li><p>为什么Loss的更新方向是增长方向的，不是（策略）梯度下降吗？</p><p>一开始训练的时候，actor mode 参数更新之后，与ref model不一样之后，KL散度开始增加，所以loss变大</p></li></ol><p><strong>GRPO能直接使用在较小参数的模型上训练微调吗？</strong></p><p>GRPO 多次采样是同一个输入，采样不同输出</p><h1 id="大模型推理"><a href="#大模型推理" class="headerlink" title="大模型推理"></a>大模型推理</h1><h2 id="推理常见参数"><a href="#推理常见参数" class="headerlink" title="推理常见参数"></a>推理常见参数</h2><ol><li>Greedy Search</li><li>Beam Search</li><li>tok-k</li><li>top-p</li><li>temperature：当<strong>T&#x3D;1</strong>时，输出分布将与标准softmax输出相同。T的值越大，输出分布就越平滑，T的值越小，输出分布越陡峭</li><li>repetition_penalty</li></ol><p>通常我们是将 top-k、top-p、Temperature 联合起来使用。使用的先后顺序是 top-k-&gt;top-p-&gt;Temperature。</p><p>LLM出现复读机现象？</p><p>原因：</p><ol><li>由于贪婪策略，LLM趋向于提高重复先前句子的概率</li><li>而且这种现象会愈演愈烈，自我强化</li></ol><p>解决办法：</p><ol><li>构造伪数据，设计惩罚因子来惩罚训练</li><li>解码策略调整，使用惩罚重复参数，beam search、调整温度T参数</li></ol><h2 id="推理优化技术"><a href="#推理优化技术" class="headerlink" title="推理优化技术"></a>推理优化技术</h2><h3 id="KV-Cache"><a href="#KV-Cache" class="headerlink" title="KV Cache"></a>KV Cache</h3><p>每一步计算注意力分数的时候，只需要新token的Q与以往的的K计算得到注意力分数，然后与之前所有的V进行计算得到最终结果，所以只有新的Q是需要新的token的Q,而K和V之前计算过的可以重复利用，所以在每一步计算的时候将K和V保存下来在下一步计算，便可以减少计算量，达到加速效果。</p><h3 id="Flash-Attention"><a href="#Flash-Attention" class="headerlink" title="Flash Attention"></a>Flash Attention</h3><p>动机：Attention机制计算 对于长序列 不友好</p><p>将输入分块计算，然后合并重新计算</p><p><a href="https://mp.weixin.qq.com/s/P_21MWC82l945jCWuUAD_A">https://mp.weixin.qq.com/s/P_21MWC82l945jCWuUAD_A</a></p><h3 id="大模型量化"><a href="#大模型量化" class="headerlink" title="大模型量化"></a>大模型量化</h3><h4 id="float16-float32-bfloat16"><a href="#float16-float32-bfloat16" class="headerlink" title="float16, float32,bfloat16"></a>float16, float32,bfloat16</h4><img src="../../../../Library/Application Support/typora-user-images/image-20250320130142579.png" alt="image-20250320130142579" style="zoom:50%;" /><p>从左到右分别是，符号位S，指数E，尾数M, R是基数（2或10）<br>$$<br>V &#x3D; (-1)^S * M * R^E<br>$$</p><p>range越大表示范围越大，precision越大表示精度越高</p><p><strong>大模型给定参数多少B，计算模型大小多少GB 和 显存占用多少GB？</strong></p><p>模型大小：1B 约等于 4G  1b&#x3D;1000M&#x3D;4000MB&#x3D;4GB 在float32的情况下 因为32bit&#x3D;4byte</p><p>显存占用：总显存&#x3D;4GB（参数）+4GB（梯度）+8GB（优化器状态）&#x3D;16GB</p><h4 id="AWQ"><a href="#AWQ" class="headerlink" title="AWQ"></a>AWQ</h4><p>按照重要性来选择性量化某些值</p><h4 id="GPTQ"><a href="#GPTQ" class="headerlink" title="GPTQ"></a>GPTQ</h4><p>按照层来选择性量化某些层</p><h2 id="思维链推理"><a href="#思维链推理" class="headerlink" title="思维链推理"></a>思维链推理</h2><p>o1发布后，国内陆续发布了很多类o1模型，比如<a href="https://zhida.zhihu.com/search?content_id=251797329&content_type=Article&match_order=1&q=deepseek-r1&zhida_source=entity">deepseek-r1</a>、<a href="https://zhida.zhihu.com/search?content_id=251797329&content_type=Article&match_order=1&q=kimi-math&zhida_source=entity">kimi-math</a>、<a href="https://zhida.zhihu.com/search?content_id=251797329&content_type=Article&match_order=1&q=macro-o1&zhida_source=entity">macro-o1</a>、<a href="https://zhida.zhihu.com/search?content_id=251797329&content_type=Article&match_order=1&q=qwq&zhida_source=entity">qwq</a>等等</p><ol><li>树搜索派系，主要使用树搜索+multi-agent合成数据</li><li>蒸馏派系，主要通过各种jail-break攻破o1的思维链展示限制、爬deepseek-r1以及使用qwen-qwq刷数据蒸馏。</li></ol><h2 id="超长上下文扩展"><a href="#超长上下文扩展" class="headerlink" title="超长上下文扩展"></a>超长上下文扩展</h2><h3 id="线性位置插值法扩展"><a href="#线性位置插值法扩展" class="headerlink" title="线性位置插值法扩展"></a>线性位置插值法扩展</h3><p>通过线性缩小输入位置索引以匹配原始上下文窗口大小，而不是超出训练上下文长度进行外推，这样可以减小注意力机制中相对位置的影响，帮助模型更容易适应扩展后的上下文窗口。</p><p>需要重新训练</p><h3 id="动态插值法"><a href="#动态插值法" class="headerlink" title="动态插值法"></a>动态插值法</h3><p>利用神经正切核 (NTK) 理论，设计非线性位置编码插值方案，改变基数而不是缩放比例，使不同位置可区分，避免线性插值的问题。</p><h3 id="Yarn方法"><a href="#Yarn方法" class="headerlink" title="Yarn方法"></a>Yarn方法</h3><p>Yarn 方法对不同频率的正弦波进行不同程度的插值：</p><ul><li>对高频正弦波几乎不进行插值，保留细微位置信息。</li><li>对低频正弦波进行接近线性的插值，保留位置大体信息。</li><li>中频正弦波进行渐变的插值。</li></ul><h1 id="大模型测评"><a href="#大模型测评" class="headerlink" title="大模型测评"></a>大模型测评</h1><h1 id="模型幻觉"><a href="#模型幻觉" class="headerlink" title="模型幻觉"></a>模型幻觉</h1><h2 id="产生的原因"><a href="#产生的原因" class="headerlink" title="产生的原因"></a>产生的原因</h2><ol><li>大模型对自己的输出缺乏因果关系的判断</li><li>LLM内部知识与人类标注的知识的不匹配，LLM内部知识不包含人类标注的知识时，模型就会产生幻觉</li></ol><h2 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h2><ol><li>让模型能够给出自己回答的依据、来源出处等（感觉是Cot的开端</li><li>强化学习，因为强化学习在给奖励是只是给出答案1比答案2好，并不给出具体原因和好的程度，所以能够让LLM自己探索出一条属于自己理解的道理</li></ol><h1 id="模型融合"><a href="#模型融合" class="headerlink" title="模型融合"></a>模型融合</h1><h2 id="Task-Vector"><a href="#Task-Vector" class="headerlink" title="Task Vector"></a>Task Vector</h2><h2 id="TIES"><a href="#TIES" class="headerlink" title="TIES"></a>TIES</h2><p>第二步的方向选择上是如何选择的？</p><h2 id="TIES-BT"><a href="#TIES-BT" class="headerlink" title="TIES-BT"></a>TIES-BT</h2><h2 id="Fuse"><a href="#Fuse" class="headerlink" title="Fuse"></a>Fuse</h2><p>不拘泥于必须同一架构，主要融合多个模型的输出vocab概率分布，然后将融合后的概率分布作为target计算loss+clm的loss一起去train模型</p><h1 id="Agent技术"><a href="#Agent技术" class="headerlink" title="Agent技术"></a>Agent技术</h1><p>面对 文本长度超过模型输入长度的情况，该怎么解决？</p><h2 id="Prompt工程"><a href="#Prompt工程" class="headerlink" title="Prompt工程"></a>Prompt工程</h2><h2 id="Prompt外挂"><a href="#Prompt外挂" class="headerlink" title="Prompt外挂"></a>Prompt外挂</h2><h2 id="分解和组合"><a href="#分解和组合" class="headerlink" title="分解和组合"></a>分解和组合</h2><h2 id="反馈"><a href="#反馈" class="headerlink" title="反馈"></a>反馈</h2><h2 id="Muti-Agent"><a href="#Muti-Agent" class="headerlink" title="Muti-Agent"></a>Muti-Agent</h2><h2 id="前瞻性分析"><a href="#前瞻性分析" class="headerlink" title="前瞻性分析"></a>前瞻性分析</h2><h3 id="中央执行机构"><a href="#中央执行机构" class="headerlink" title="中央执行机构"></a>中央执行机构</h3><h3 id="记忆"><a href="#记忆" class="headerlink" title="记忆"></a>记忆</h3><h3 id="多模态"><a href="#多模态" class="headerlink" title="多模态"></a>多模态</h3><h3 id="学习"><a href="#学习" class="headerlink" title="学习"></a>学习</h3><h3 id="世界模型"><a href="#世界模型" class="headerlink" title="世界模型"></a>世界模型</h3>]]>
    </content>
    <id>https://boywuxu.github.io/2025/02/16/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E7%AE%97%E6%B3%95%E5%AE%9E%E4%B9%A0%E5%85%AB%E8%82%A1/</id>
    <link href="https://boywuxu.github.io/2025/02/16/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E7%AE%97%E6%B3%95%E5%AE%9E%E4%B9%A0%E5%85%AB%E8%82%A1/"/>
    <published>2025-02-15T16:00:00.000Z</published>
    <summary>
      <![CDATA[<p><strong>一般来说，开发岗位的算法面试是不会出题要求面试者临时设计一个数据结构来解决某个问题，大多数时候只是要求面试者能够熟练掌握常见的数据结构及其实现、能够说出这种数据结构的优缺点即可。</strong></p>
<h1 id="大模型架构"><a href="#大模型架构" class="headerlink" title="大模型架构"></a>大模型架构</h1><h2 id="原始-Transformer"><a href="#原始-Transformer" class="headerlink" title="原始 Transformer"></a>原始 Transformer</h2><img src="/images/2-transformer.png" alt="transformer" style="zoom:50%;">

<h2 id="分词方式"><a href="#分词方式" class="headerlink" title="分词方式"></a>分词方式</h2><h3 id="字节对编码-BPE"><a href="#字节对编码-BPE" class="headerlink" title="字节对编码 BPE"></a>字节对编码 BPE</h3><p>本质上是subword作为词表，只不过是优先合并出现频率高的字符，直到词表大小合适或者最高词频为1</p>
<h2 id="注意力机制"><a href="#注意力机制" class="headerlink" title="注意力机制"></a>注意力机制</h2><h3 id="注意力评分函数"><a href="#注意力评分函数" class="headerlink" title="注意力评分函数"></a>注意力评分函数</h3><ul>
<li><p>加性注意力评分函数<br>$$<br>a(q,k)&#x3D;w^T_vtanh(W_qq+W_kk)<br>$$<br> 加性注意力评分函数可以看作，将查询和键连结起来后输入到一个多层感知机（MLP）中， 感知机包含一个隐藏层，其隐藏单元数是一个超参数ℎ。 通过使用tanh作为激活函数，并且禁用偏置项，</p>
</li>
<li><p>缩放点积注意力评分函数<br>$$<br>a(q,k)&#x3D;\frac{QK^T}{\sqrt{d}}<br>$$<br> 为确保无论向量长度如何， 点积的方差在不考虑向量长度的情况下仍然是1， 将点积除以$$\sqrt{d}$$</p>
</li>
</ul>]]>
    </summary>
    <title>大模型算法实习八股</title>
    <updated>2026-04-01T15:20:19.515Z</updated>
  </entry>
  <entry>
    <author>
      <name>无序</name>
    </author>
    <content>
      <![CDATA[<h1 id="心理学效应"><a href="#心理学效应" class="headerlink" title="心理学效应"></a>心理学效应</h1><h2 id="彼得原理"><a href="#彼得原理" class="headerlink" title="彼得原理"></a>彼得原理</h2><p>《彼得原理》(英语:Peter Principle)是管理学家劳伦斯·彼得在1969年出版的一本同名书，里面提出的“彼得原理”是指:在组织或企业的等级制度中，人会因其某种特质或特殊技能，令他被擢升到不能胜任的高阶职位，最终变成组织的障碍物(冗员)及负资产。</p><h2 id="孕妇效应"><a href="#孕妇效应" class="headerlink" title="孕妇效应"></a>孕妇效应</h2><p>孕妇效应意即偶然因素随着自己的关注而让你觉得是个普遍现象，就是当人怀孕了就更容易发现孕妇，你开了奔驰就更容易看到奔驰，你拎了一个LV就容易发现满大街都是LV。用来形容人们容易把自己的关注点投射在外界，以寻找更多案例来证实内心想法的情况。</p><h2 id="梅拉宾法则"><a href="#梅拉宾法则" class="headerlink" title="梅拉宾法则"></a>梅拉宾法则</h2><p>梅拉宾法则(The Rule of Mehrabian):梅拉宾在1971年提出:一个人对他人的印象，约有7%取决于谈话的内容，辅助表达的方法如手势、语气等则占了38%，肢体动作所占的比例则高达55%，</p><h2 id="鹅卵石法则"><a href="#鹅卵石法则" class="headerlink" title="鹅卵石法则"></a>鹅卵石法则</h2><p>今天看到一个说法:人们会时不时把有趣的短视频、图片或者可爱的小故事分享给所爱的人。这种行为叫Pebbling，意为“丢鹅卵石”。据说有一种企鹅喜欢在伴侣的巢穴中留一块鹅卵石，告诉它我来过，我很关心你。</p><h2 id="GABA"><a href="#GABA" class="headerlink" title="GABA"></a>GABA</h2><p>人类喜欢从故事中得到顿悟。因为顿悟会激发一种叫做GABA的神经递质，它跟缓解焦虑有关。<br>    每个人的大脑中，有两种主要的神经递质:一种是GABA，另一种是谷氨酸。当谷氨酸过多时，它会过度刺激神经细胞，导致焦虑、、紧张等情绪问题. 而GABA则相反</p><h2 id="坎贝尔定律和古德哈特定律"><a href="#坎贝尔定律和古德哈特定律" class="headerlink" title="坎贝尔定律和古德哈特定律"></a>坎贝尔定律和古德哈特定律</h2><p>坎贝尔定律说，决策当中使用的一项指标越受重视，就越容易被操纵。</p><p>好比网络购物，实物我们看不见摸不着，自然就会参考其他买家的评价，于是“刷单”现象也就应运而生了。</p><p>古德哈特定律则认为，如果一项指标被人们刻意追逐，那就不（或不再）是一个好的指标。</p><p>但在没有更好的替代指标的情况下，就必须确保数据的真实度了，就好像在考试中要不遗余力地打击作弊一样。</p><h2 id="写作与思考"><a href="#写作与思考" class="headerlink" title="写作与思考"></a>写作与思考</h2><p>比莱斯利·兰波特（LaTeX排版系统的开发者）曾说：如果你不写作，你可能只是在自欺欺人地认为你已经思考了。（注：If you’re thinking without writing, you only think you’re thinking.）</p><h2 id="蝴蝶效应"><a href="#蝴蝶效应" class="headerlink" title="蝴蝶效应"></a>蝴蝶效应</h2><p>一只南美洲亚马逊河流域热带雨林中的蝴蝶，偶尔扇动了几下翅膀，在两周后可能引起美国得克萨斯州的一场龙卷风暴。在心理学上，蝴蝶效应表现为一种不同于普通的连锁效应的，因果性不明显的情绪反应和行为。</p><h2 id="狄德罗效应"><a href="#狄德罗效应" class="headerlink" title="狄德罗效应"></a><strong>狄德罗效应</strong></h2><p>18世纪法国一位哲学家丹尼斯.狄德罗，某天友人赠其一件高级睡袍，他非常喜欢。但当他穿上之后，开始觉得家里的一切家具和装饰都显得粗陋庸俗，于是不得不把旧的东西一件件更新，但最终她仍不觉得开心，因为他最终发现，“自己竟然被一条睡袍胁迫”。</p><p>一种常见的“愈得愈不足效应”，即<strong>在没有得到某种东西时，心里很平稳，而一旦得到了，却不满足</strong>。</p><h2 id="齐加尼克效应"><a href="#齐加尼克效应" class="headerlink" title="齐加尼克效应"></a><strong>齐加尼克效应</strong></h2><p>源于法国心理学家齐加尼克做的一次实验。他将受试者分成两组，分别去完成20项工作。其间，他对其中一组进行干预，使他们的工作不能顺利完成，而让另一组毫无阻碍，顺利完成全部工作。尽管所有受试者接受任务时都非常紧张，但顺利完成任务者紧张状态随之消失，而未能完成任务者，思绪总是被那些任务困扰，紧张状态持续存在。</p><h2 id="罗森塔尔效应"><a href="#罗森塔尔效应" class="headerlink" title="罗森塔尔效应"></a>罗森塔尔效应</h2><p>古希腊传说中塞浦路斯岛一位年轻的王子皮格马力翁，酷爱艺术，通过锲而不舍的努力终于雕塑了一尊女神像。面对自己的作品他爱不释手，整日深情注视。天长日久，女神竟然奇迹般复活，并成为了他的妻子。这个故事说明，期待是一种力量。</p><p>1968年，美国心理学家罗伯.罗森塔尔提出了该项理论。此理论有一个我们最常听到的例子：两个病人同住一家医院，其中一人患了癌症，而另一人并无大碍。但医生把两人的诊断书弄混了。结果那个真正的病患得知后整天心情轻松，开心地在医院住了一段日子便健康地出院了。而那个原本身体无恙的人却终日活在对死亡与病痛的恐惧中，最后真的罹患绝症，在抑郁绝望中死去。</p><h3 id="林迪效应"><a href="#林迪效应" class="headerlink" title="林迪效应"></a>林迪效应</h3><p>对于某些非易腐事物（如技术、思想、书籍等），其未来的预期寿命与其当前已存在的时间成正比。<strong>一个事物存在的时间越长，它未来继续存在的可能性就越大。</strong></p><h3 id="阿伦森效应"><a href="#阿伦森效应" class="headerlink" title="阿伦森效应"></a>阿伦森效应</h3><p>“阿伦森效应”是指<strong>人们最喜欢那些对自己的喜欢、奖励、赞扬不断增加的人或物，最不喜欢那些显得不断减少的人或物</strong>。 阿伦森是一位著名的心理学家，他认为，人们大都喜欢那些对自己表示赞赏的态度或行为不断增加的人或事，而反感上述态度或行为不断减少的人或事。</p><h3 id="峰终定律"><a href="#峰终定律" class="headerlink" title="峰终定律"></a>峰终定律</h3><p>根据峰终定律，<strong>人们在回忆一段时间内的经历时，更多地依赖于该段经历的高峰（最显著的部分）和结束时的感受，而不是整段经历的平均体验</strong>。 具体来说，峰终定律认为： 高峰效应（Peak Effect）：人们更倾向于记住或强烈关注经历中的高潮或高峰时刻，这些时刻通常是情感上最强烈或者最显著的部分。</p>]]>
    </content>
    <id>https://boywuxu.github.io/2025/01/25/%E6%95%88%E5%BA%94/</id>
    <link href="https://boywuxu.github.io/2025/01/25/%E6%95%88%E5%BA%94/"/>
    <published>2025-01-24T16:00:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="心理学效应"><a href="#心理学效应" class="headerlink" title="心理学效应"></a>心理学效应</h1><h2 id="彼得原理"><a href="#彼得原理" class="headerlink" title="彼得原理"></a>彼得原理</h2><p>《彼得原理》(英语:Peter Principle)是管理学家劳伦斯·彼得在1969年出版的一本同名书，里面提出的“彼得原理”是指:在组织或企业的等级制度中，人会因其某种特质或特殊技能，令他被擢升到不能胜任的高阶职位，最终变成组织的障碍物(冗员)及负资产。</p>
<h2 id="孕妇效应"><a href="#孕妇效应" class="headerlink" title="孕妇效应"></a>孕妇效应</h2><p>孕妇效应意即偶然因素随着自己的关注而让你觉得是个普遍现象，就是当人怀孕了就更容易发现孕妇，你开了奔驰就更容易看到奔驰，你拎了一个LV就容易发现满大街都是LV。用来形容人们容易把自己的关注点投射在外界，以寻找更多案例来证实内心想法的情况。</p>
<h2 id="梅拉宾法则"><a href="#梅拉宾法则" class="headerlink" title="梅拉宾法则"></a>梅拉宾法则</h2><p>梅拉宾法则(The Rule of Mehrabian):梅拉宾在1971年提出:一个人对他人的印象，约有7%取决于谈话的内容，辅助表达的方法如手势、语气等则占了38%，肢体动作所占的比例则高达55%，</p>
<h2 id="鹅卵石法则"><a href="#鹅卵石法则" class="headerlink" title="鹅卵石法则"></a>鹅卵石法则</h2><p>今天看到一个说法:人们会时不时把有趣的短视频、图片或者可爱的小故事分享给所爱的人。这种行为叫Pebbling，意为“丢鹅卵石”。据说有一种企鹅喜欢在伴侣的巢穴中留一块鹅卵石，告诉它我来过，我很关心你。</p>
<h2 id="GABA"><a href="#GABA" class="headerlink" title="GABA"></a>GABA</h2>]]>
    </summary>
    <title>效应</title>
    <updated>2026-04-01T07:44:55.020Z</updated>
  </entry>
  <entry>
    <author>
      <name>无序</name>
    </author>
    <content>
      <![CDATA[<table><thead><tr><th align="center">模型</th><th align="center">分数</th></tr></thead><tbody><tr><td align="center"></td><td align="center"></td></tr><tr><td align="center">glm-4-9b-chat-1m_7.csv</td><td align="center">53</td></tr><tr><td align="center">glm-4-9b-chat-1m_15.csv</td><td align="center">64</td></tr><tr><td align="center">glm-4-9b-chat-1m_20.csv</td><td align="center">63</td></tr><tr><td align="center">Yi-9B-chat-15</td><td align="center">70</td></tr><tr><td align="center">Yi-9B-chat-7</td><td align="center">63</td></tr><tr><td align="center">Yi-9B-chat-20</td><td align="center">53</td></tr><tr><td align="center"></td><td align="center"></td></tr><tr><td align="center">glm-4-9b-chat-1m_have_kongge_7.csv</td><td align="center"></td></tr><tr><td align="center">glm-4-9b-chat-1m_have_kongge_15.csv</td><td align="center">59</td></tr><tr><td align="center">glm-4-9b-chat-1m_have_kongge_20.csv</td><td align="center">74</td></tr><tr><td align="center">glm-4-9b-chat-1m_have_kongge_25.csv</td><td align="center">81</td></tr><tr><td align="center">glm-4-9b-chat-1m_have_kongge_30.csv</td><td align="center">79</td></tr><tr><td align="center">glm-4-9b-chat-1m_have_kongge_35.csv</td><td align="center">84</td></tr><tr><td align="center">glm-4-9b-chat-1m_have_kongge_40.csv</td><td align="center">79</td></tr><tr><td align="center">glm-4-9b-chat-1m_have_kongge_45.csv</td><td align="center">84</td></tr><tr><td align="center">glm-4-9b-chat-1m_have_kongge_50.csv</td><td align="center">76</td></tr><tr><td align="center">glm-4-9b-chat-1m_have_kongge_55.csv</td><td align="center">82</td></tr><tr><td align="center">glm-4-9b-chat-1m_have_kongge_60.csv</td><td align="center">81</td></tr><tr><td align="center">glm-4-9b-chat-1m_have_kongge_65.csv</td><td align="center">81</td></tr><tr><td align="center">glm-4-9b-chat-1m_have_kongge_70.csv</td><td align="center">77</td></tr><tr><td align="center"></td><td align="center"></td></tr><tr><td align="center">glm-4-9b-chat-1m_rerank_30_15</td><td align="center">77</td></tr><tr><td align="center">glm-4-9b-chat-1m_rerank_70_30</td><td align="center">82</td></tr><tr><td align="center">glm-4-9b-chat-1m_rerank_80_25</td><td align="center">80</td></tr><tr><td align="center">glm-4-9b-chat-1m_rerank_80_30</td><td align="center">79</td></tr><tr><td align="center">glm-4-9b-chat-1m_have_kongge_story_new_45</td><td align="center">81</td></tr><tr><td align="center">glm-4-9b-chat-1m_have_kongge_story_new_35</td><td align="center">83</td></tr><tr><td align="center"></td><td align="center"></td></tr><tr><td align="center">Yi-9B-chat-7_have_kongge_15</td><td align="center">50</td></tr><tr><td align="center">Yi-9B-chat-7_have_kongge_16</td><td align="center">61</td></tr><tr><td align="center">Yi-9B-chat-7_have_kongge_17</td><td align="center">58</td></tr><tr><td align="center">Yi-9B-chat-7_have_kongge_12</td><td align="center">59</td></tr><tr><td align="center">Yi-9B-chat-7_have_kongge_13</td><td align="center">59</td></tr><tr><td align="center">Yi-9B-chat-7_have_kongge_7</td><td align="center">52</td></tr><tr><td align="center">Yi-9B-chat-7_have_kongge_20</td><td align="center">57</td></tr><tr><td align="center">qwen2-72B-In-have_kongge_15</td><td align="center">68</td></tr><tr><td align="center"></td><td align="center"></td></tr><tr><td align="center"></td><td align="center">57</td></tr><tr><td align="center">Yi-9B-chat-7_rerank_30_15</td><td align="center">52</td></tr></tbody></table><ul><li><input disabled="" type="checkbox"> 数据清洗，去除文档里面的脏数据</li><li><input disabled="" type="checkbox"> 切割文档的长度 这个参数还可以调</li><li><input disabled="" type="checkbox"> 多次答案投票</li><li><input disabled="" type="checkbox"> 微软的GraphRAG技术</li><li><input checked="" disabled="" type="checkbox"> 英文没有空格</li></ul>]]>
    </content>
    <id>https://boywuxu.github.io/2024/07/09/%E4%B8%AD%E5%85%B4-%E7%9F%A5%E8%AF%86%E5%B7%A5%E7%A8%8B/</id>
    <link href="https://boywuxu.github.io/2024/07/09/%E4%B8%AD%E5%85%B4-%E7%9F%A5%E8%AF%86%E5%B7%A5%E7%A8%8B/"/>
    <published>2024-07-08T16:00:00.000Z</published>
    <summary>
      <![CDATA[<table>
<thead>
<tr>
<th align="center">模型</th>
<th align="center">分数</th>
</tr>
</thead>
<tbody><tr>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">glm-4-9b-chat-1m_7.csv</td>
<td align="center">53</td>
</tr>
<tr>
<td align="center">glm-4-9b-chat-1m_15.csv</td>
<td align="center">64</td>
</tr>
<tr>
<td align="center">glm-4-9b-chat-1m_20.csv</td>
<td align="center">63</td>
</tr>
<tr>
<td align="center">Yi-9B-chat-15</td>
<td align="center">70</td>
</tr>
<tr>
<td align="center">Yi-9B-chat-7</td>
<td align="center">63</td>
</tr>
<tr>
<td align="center">Yi-9B-chat-20</td>
<td align="center">53</td>
</tr>
<tr>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">glm-4-9b-chat-1m_have_kongge_7.csv</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">glm-4-9b-chat-1m_have_kongge_15.csv</td>
<td align="center">59</td>
</tr>
<tr>
<td align="center">glm-4-9b-chat-1m_have_kongge_20.csv</td>
<td align="center">74</td>
</tr>
<tr>
<td align="center">glm-4-9b-chat-1m_have_kongge_25.csv</td>
<td align="center">81</td>
</tr>
<tr>
<td align="center">glm-4-9b-chat-1m_have_kongge_30.csv</td>
<td align="center">79</td>
</tr>
<tr>
<td align="center">glm-4-9b-chat-1m_have_kongge_35.csv</td>
<td align="center">84</td>
</tr>
<tr>
<td align="center">glm-4-9b-chat-1m_have_kongge_40.csv</td>
<td align="center">79</td>
</tr>
<tr>
<td align="center">glm-4-9b-chat-1m_have_kongge_45.csv</td>
<td align="center">84</td>
</tr>
<tr>
<td align="center">glm-4-9b-chat-1m_have_kongge_50.csv</td>
<td align="center">76</td>
</tr>
<tr>
<td align="center">glm-4-9b-chat-1m_have_kongge_55.csv</td>
<td align="center">82</td>
</tr>
<tr>
<td align="center">glm-4-9b-chat-1m_have_kongge_60.csv</td>
<td align="center">81</td>
</tr>
<tr>
<td align="center">glm-4-9b-chat-1m_have_kongge_65.csv</td>
<td align="center">81</td>
</tr>
<tr>
<td align="center">glm-4-9b-chat-1m_have_kongge_70.csv</td>
<td align="center">77</td>
</tr>
<tr>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">glm-4-9b-chat-1m_rerank_30_15</td>
<td align="center">77</td>
</tr>
<tr>
<td align="center">glm-4-9b-chat-1m_rerank_70_30</td>
<td align="center">82</td>
</tr>
<tr>
<td align="center">glm-4-9b-chat-1m_rerank_80_25</td>
<td align="center">80</td>
</tr>
<tr>
<td align="center">glm-4-9b-chat-1m_rerank_80_30</td>
<td align="center">79</td>
</tr>
<tr>
<td align="center">glm-4-9b-chat-1m_have_kongge_story_new_45</td>
<td align="center">81</td>
</tr>
<tr>
<td align="center">glm-4-9b-chat-1m_have_kongge_story_new_35</td>
<td align="center">83</td>
</tr>
<tr>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center">Yi-9B-chat-7_have_kongge_15</td>
<td align="center">50</td>
</tr>
<tr>
<td align="center">Yi-9B-chat-7_have_kongge_16</td>
<td align="center">61</td>
</tr>
<tr>
<td align="center">Yi-9B-chat-7_have_kongge_17</td>
<td align="center">58</td>
</tr>
<tr>
<td align="center">Yi-9B-chat-7_have_kongge_12</td>
<td align="center">59</td>
</tr>
<tr>
<td align="center">Yi-9B-chat-7_have_kongge_13</td>
<td align="center">59</td>
</tr>
<tr>
<td align="center">Yi-9B-chat-7_have_kongge_7</td>
<td align="center">52</td>
</tr>
<tr>
<td align="center">Yi-9B-chat-7_have_kongge_20</td>
<td align="center">57</td>
</tr>
<tr>
<td align="center">qwen2-72B-In-have_kongge_15</td>
<td align="center">68</td>
</tr>
<tr>
<td align="center"></td>
<td align="center"></td>
</tr>
<tr>
<td align="center"></td>
<td align="center">57</td>
</tr>
<tr>
<td align="center">Yi-9B-chat-7_rerank_30_15</td>
<td align="center">52</td>
</tr>
</tbody></table>
<ul>
<li><input disabled type="checkbox"> 数据清洗，去除文档里面的脏数据</li>
<li><input disabled type="checkbox"> 切割文档的长度 这个参数还可以调</li>
<li><input disabled type="checkbox"> 多次答案投票</li>
<li><input disabled type="checkbox"> 微软的GraphRAG技术</li>
<li><input checked disabled type="checkbox"> 英文没有空格</li>
</ul>]]>
    </summary>
    <title>中兴-知识工程</title>
    <updated>2026-04-01T07:44:55.011Z</updated>
  </entry>
  <entry>
    <author>
      <name>无序</name>
    </author>
    <content>
      <![CDATA[<h1 id="A-Controllable-Text-Generation-Framework-based-Prompt-learning-for-Query-Auto-completion"><a href="#A-Controllable-Text-Generation-Framework-based-Prompt-learning-for-Query-Auto-completion" class="headerlink" title="A Controllable Text Generation Framework based Prompt learning for Query Auto-completion"></a>A Controllable Text Generation Framework based Prompt learning for Query Auto-completion</h1><h3 id="论文思路"><a href="#论文思路" class="headerlink" title="论文思路"></a>论文思路</h3><p>研究领域是query自动补全（QAC），对应的显示场景是搜索栏的用户搜索场景，用的研究方法是生成式模型而非召回是模型（该领域常规的方法是先生成候选词，然后对候选词排序）</p><p>对于QAC领域，传统的召回式生成query仅仅通过候选词频率进行召回，缺乏对于query语意层面的理解，同时对于unseen 的输入，难以生成高质量的补全，以及召回式的生成难以充分实现个性化的生成</p><p><strong>其他生成模型的历史信息的局限性：时间跨度短，数据量比较少，</strong>随着NLP领域中NLG模型的发展，transformer系列的自然语言生成式模型在各个领域展现出巨大的潜力，而且像GPT2这样在大量无监督数据上训练的模型，拥有强大的语意理解能力，有越来越多的研究工作研究生成式模型用于QAC,生成式的模型能够有效应对上述的几个问题。（蹭大模型的热度，垂直领域生成模型）</p><p>对于GPT模型，我们使用提示学习来对GPT的生成做进一步的控制，来达到用户的个性化需求，通过使用提示学习对GPT进行微调，可以使GPT模型生成的query更加贴近用户偏好习惯，而传统上的提示学习包括hard提示和soft提示都是从自然语言语意层面对GPT的输出进行提示，而用户个人的消费行为习惯可能无法简单的从语言层面展现，而在使用bert模型进行语意理解和语意抽取进而进行下游任务的分类时，bert可以很好地进行高维度的特征表征，所以在本文中我们采用bert模型抽取高维度的用户个人特征表征作为GPT模型的提示，进而使GPT的输出达到个性化的要求。（特别的，bert和GPT使用统一词表来保证两个模型的高维映射空间是一致的）</p><h2 id="Abstract"><a href="#Abstract" class="headerlink" title="Abstract"></a>Abstract</h2><p>Query auto-completion (QAC) aims at suggesting plausible completions for a given query prefix. The recent QAC methods introduce Natural Language Generation to generate the completions for user input. </p><p>  However, NLG (Natural Lagnuage Generation) methods ususally output unsense or wrong words without controll. Moreover, A serious drawback of generative methods is that they can produce an ether effect. It severely affected the performance of the generative methods. </p><p>  We proposed a framework that controls the generation of queries using prompt learning methods, thereby making the generative methods controllable. This framework consists of three parts: the control module, the prompt module, and the generation module. The control module generates a prompt vector endowed with implicit features, then the prompt module ingests the prompt vector and user input into the generation module, and ultimately, the generation module generates the query under control. </p><p>  We trained and tested our model on the Meituan dataset and the AOL dataset. The outcomes reveal that the framework we proposed can elevate the accuracy of queries while mitigating the incoherence of queries.</p><h2 id="The-CTGPrompt4QAC-Framework"><a href="#The-CTGPrompt4QAC-Framework" class="headerlink" title="The CTGPrompt4QAC Framework"></a>The CTGPrompt4QAC Framework</h2><p>在这一节，我们首先介绍QAC的问题定义，然后介绍我们提出的可控提示框架，最后介绍整个框架是如何训练的。</p><h3 id="The-QAC-task-define"><a href="#The-QAC-task-define" class="headerlink" title="The QAC task define"></a>The QAC task define</h3><p>Query Auto-completion是利用用户少量的输入，来为用户生成其可能想要的结果，进而节省用户在搜索过程的时间的一种技术。假设$I$表示用户输入，$G$表示补全的结果，$u$表示用户的信息，那么$G&#x3D;f(I)$，表示完全利用用户的输入来为用户生成结果，而更加个性化的生成是$G_p&#x3D;g(I,u)$，其中$G_p$表示个性化的生成。</p><p>在QAC场景中，我们将问题转换为自然语言处理的问题。因为用户的输入和生成都是自然语言，即$I&#x3D;{i_1,i_2 \cdots i_n}$，$G&#x3D;{g_1,g_2 \cdots g_n}$，其中$i$和$g$都表示具体的字符token，所以$G&#x3D;f( I )$可以看作一个自回归问题，即$g_n&#x3D;f( i_1,i_2, \cdots,g_{n-2},g_{n-1})$。</p><p>Query Auto-completion is a technology that uses users’ minimal input to generate possible desired results for them, thereby saving them time during the search process. Assuming $I$ represents user input, $G$ represents completed results, and $u$ represents user information, then $G&#x3D;f(I)$ represents generating results completely utilizing user input, while a more personalized generation is $G_p&#x3D;g(I,u)$. </p><p>In the QAC scenario, we convert the problem into a natural language processing problem. Since both user input and generated results are natural language, namely $I&#x3D;{i_1,i_2 \cdots i_n}$ and $G&#x3D;{g_1,g_2 \cdots g_n}$ where $i$ and $g$ represent specific character tokens, therefore $G&#x3D;f(I)$ can be regarded as an autoregressive problem, namely $g_n&#x3D;f(i_1,i_2, \cdots,g_{n-2},g_{n-1})$.</p><h3 id="Overview-of-the-framework"><a href="#Overview-of-the-framework" class="headerlink" title="Overview of the framework"></a>Overview of the framework</h3><p>首先我们对框架的整体架构进行介绍和解释，框架包括三个部分：生成模块、提示模块和控制模块。生成模块是一个decoder架构，用于预测下一个token，生成模块通常是gpt这样的预训练模型。为了能够对生成模块进行生成效果的控制，我们使用提示学习的方法来进行控制，也就是在生成模块的输入前加入提示向量，提示向量能够对生成模块的模型起到提示作用，这就是提示模块的作用。提示模块中的提示向量是由控制模块产生的，控制模块通过从带有控制目的标签的历史数据中学习得到，生成具有控制效果的提示向量。</p><p>First, we introduce and explain the overall architecture of the framework, which includes three parts: the generation module, the prompt module, and the control module. The generation module is a decoder architecture that predicts the next token and generates text. It typically uses a pre-trained model like GPT. To enable control over the generation effect of the generation module, we use prompt learning methods for control. This means adding a prompt vector to the input of the generation module before generating the text. The prompt vector can provide hints to the model, which is the role of the prompt module. The prompt vector generated in the prompt module is produced by the control module through learning from historical data with controlled purpose labels. This generates a prompt vector with controlling effects.</p><h4 id="1-Control-Module"><a href="#1-Control-Module" class="headerlink" title="1. Control Module"></a>1. Control Module</h4><p>控制模块的输入是用户的个人特征信息和用户的历史数据，输出是用户是否进行点击行为的概率，用户是否对生成词进行点击代表了该用户的偏好，模型是用了Bert模型，因为Bert模型具有深层次的语义理解能力，能够对用户的历史行为数据进行深层次的语义理解和特征抽取。为了体现控制模块的控制作用，我们在考虑除了令控制模块生成体现用户偏好的高维特征向量之外，我们还考虑了生成式模型有非常严重的马太效应现象，因为生成式模型本质上是一个词概率预测模型，所以生成式模型会以更大概率生成在训练集中频繁出现的token，所以想要用控制模块在起到控制生成符合用户偏好结果之外同时能起到控制生成式模型的马太效应。所以在控制模块的Bert模型输出会输入到两个多层神经网络分类器进行多任务学习，一个分类器是用于区分用户是否进行点击，另一个分类器是用来区分用户是否会更倾向于点击低频词的生成结果。通过对用户个人信息和历史的行为数据进行建模，控制模块能够抽取到表征着用户偏好的特征向量。</p><p>The input to the control module is the personal feature information of the user and the user’s historical data, and the output is the probability of the user performing a click behavior. Whether the user clicks on the generated words represents the user’s preferences. The model uses the Bert model because the Bert model has deep semantic understanding capabilities and can perform deep semantic understanding and feature extraction on the user’s historical behavioral data. To reflect the controlling effect of the control module, in addition to letting the control module generate high-dimensional feature vectors reflecting user preferences, we also consider that the generative model has a severe Matthew effect phenomenon. Because the generative model is essentially a word probability prediction model, the generative model will predict tokens that appear frequently in the training set with a higher probability. Therefore, in addition to controlling the generation of user preference-conforming results, the control module can also control the Matthew effect of the generative model.Therefore, the output of the Bert model in the control module will be input to two multi-layer neural network classifiers for multi-task learning. One classifier is used to distinguish whether the user performs a click, and the other classifier is used to distinguish whether the user is more likely to click on the generated results of low-frequency words. By modeling the user’s personal information and historical behavior data, the control module can extract a feature vector representing the user’s preferences.</p><h4 id="2-Prompt-Module"><a href="#2-Prompt-Module" class="headerlink" title="2. Prompt Module"></a>2. Prompt Module</h4><p>提示模块主要由一个多层神经网络组成，将Bert抽取出来的高维特征映射到gpt模型的文本embedding空间中，并将控制模块生成的特征向量进行resize，并将特征向量作为提示与用户的输入embedding合并，之后一起输入到生成模块中。</p><h4 id="3-Generation-Module"><a href="#3-Generation-Module" class="headerlink" title="3. Generation Module"></a>3. Generation Module</h4><p>生成模块的输入是提示模块的提示向量与用户的输入文本的向量，本文中生成模块的模型是GPT2，GPT2根据提示向量对用户输入文本进行结果补全，因为提示向量中蕴含的用户偏好特征情况下，GPT2模型能够生成更加符合用户偏好的结果，并且能够减少那些不热衷于高频商家的用户的马太效应。</p><h3 id="Training-Strategy"><a href="#Training-Strategy" class="headerlink" title="Training Strategy"></a>Training Strategy</h3><p>训练阶段分为两个个阶段：预训练、微调</p><p>预训练阶段分为两个部分：第一部分是对控制模块进行预训练，第二部分是对生成模块进行预训练</p><p>对控制模块预训练实际上是对预训练的Bert模型进行下游任务微调，将用户的用户特征和用户历史的输入和生成的item作为Bert模型的输入</p><p>微调阶段只要针对生成模块和提示模块，微调分为两个阶段：第一阶段只微调提示模块，生成模块的参数是冻结的；第二阶段是微调提示模块和生成模块。</p><h2 id="Experiments"><a href="#Experiments" class="headerlink" title="Experiments"></a>Experiments</h2><h3 id="Experiment-Settings"><a href="#Experiment-Settings" class="headerlink" title="Experiment Settings"></a>Experiment Settings</h3><h4 id="dataset"><a href="#dataset" class="headerlink" title="dataset"></a>dataset</h4><p>美团数据</p><p>AOL数据</p><h4 id="Evaluation"><a href="#Evaluation" class="headerlink" title="Evaluation"></a>Evaluation</h4><p>BLEU-1、BLEU-2、BLEU-3、BLEU-4</p><p>基尼指数</p><h4 id="Baselines"><a href="#Baselines" class="headerlink" title="Baselines"></a>Baselines</h4><h4 id="Implementation-Details"><a href="#Implementation-Details" class="headerlink" title="Implementation Details"></a>Implementation Details</h4><h3 id="Experimental-Results"><a href="#Experimental-Results" class="headerlink" title="Experimental Results"></a>Experimental Results</h3><p>第一，在传统经典的生成式模型中，生成效果比较好的是Transformer模型，相比较与传统的RNN、CNN系列的生成模型，Transformer模型在自然语言建模上效果更好，所以在同样的数据集上进行训练，Transformer效果更好。甚至，Transformer模型的效果也要比不经过微调的GPT-2模型的效果要好，但是在UCTG框架下经过微调后的模型效果要好于其他所有模型</p><p>第二，与hard prompt 和 soft prompt 相比，在UTCG框架下微调的模型效果是更好的，从结果来看，hard prompt效果好于soft prompt，这是不符合常规逻辑的，但是综合QAC的具体场景和基于的底座模型来考虑，对于GPT-2这种参数量不大的底座模型，soft prompt的微调方法很难发挥出其特点，因为微调方法是依赖于底座模型的能力，如果底座模型的参数量越大，效果越好，那么经过soft prompt微调之后效果也会更好，相反，对于底座模型参数量小的情况，soft prompt可能会起到相反的作用。hard prompt的效果略好与未经微调的模型，这是因为hard prompt中有用户历史的点击item，能够对GPT-2起到一定的提示作用</p><p>第三，从基尼指数效果来看，经过UTCG(多任务)的提示微调的基尼指数要远远小于正常训练得到的模型，而且Transformer模型的基尼指数最高，这也说明Transformer模型非常依赖于token之间的关联度，其他的生成模型都不同程度的增强了生成的马太效应，而经过UTCG框架微调之后的模型基尼指数明显降低也证明了UTCG框架中控制模块抽取的embedding的有效性，并且可以看出，在经过多任务UTCG框架微调的GPT-2模型虽然在基尼指数上效果明显，但是在文本准确度上有所下降，这可能是因为控制模块生成的提示向量在信息容量不变的前提下无法做到将两种提示高维特征整合或者控制模块在多任务学习时更多地学习到了对马太效应的控制特征。</p><p>总的来说，经过UTCG框架微调过后的GPT-2模型能够在控制模块的定向提示下进行相应的文本控制，并且效果有明显地提升</p><p>原始的AOL查询日志包含用户输入的一系列查询以及时间戳详细信息。我们首先通过将所有查询转换为小写，删除重复和单个字符的查询，并删除具有占主导地位（&gt;50%）的非字母数字字符的查询来预处理数据集。为了训练和评估QAC模型，大多数先前的工作从公共查询日志数据集中构建前缀-查询对作为正样本，通过拆分用户输入的完整查询，然后随机从候选池中选择一些查询构建负样本。这些数据集不包含任何真实的前缀到查询点击行为，但在实际的工业开发中，工程师通常使用前缀-查询对训练学习排序模型，其中包括用户输入的前缀和用户点击的完成查询作为正样本，其他对作为负样本。</p><p>原始的AOL quert log数据集只包含了用户的输入、用户是否有点击行为以及时间戳的信息，这些数据并无法直接表征出用户的输入、系统的query候选词、用户对系统query候选词的行为三者的关系，所以我们需要对AOL数据集进行一定的数据处理。我们首先将所有的用户真实输入全部转换为小写，删除重复和单个字符查询，并删除以非字母数字字符为主要输入的用户输入。之后对于每个用户的真实输入，随机取前几位作为用户的模拟输入，使用完整的用户输入作为模拟query，并随机从数据集中选择一些用户完整输入作为负样本，这样就构造出了包含用户输入、query候选词以及用户行为反馈的数据集。</p><p>Tables 3展示了模型在Meituan Query Log和AOL Query Log两个数据集上的指标效果</p><p>各个模型在AOL数据集上的效果趋势与在Meituan数据集上的大致相似，在传统生成模型中，Transformer在两个数据集上的效果都是最好的，与没有微调之前的GPT-2模型和freeze方式进行微调的GPT-2模型的效果差距很小，这说明了在两组实验上模型效果的一致性。在UTCG框架下微调之后的GPT-2模型，在Meituan数据集和AOL数据集市上都表现出了最好的效果，这说明了UTCG框架在不同数据集上的泛化性，证明了UTCG框架的有效性不是只出现在某个数据集上的，是具有普世性的。同时可以观察到，在Meituan数据集上UTCG框架微调的效果提升要明显高于在AOL数据集上的提升，这是因为Meituan数据集是垂直领域的数据集，文本数据都属于商品领域的数据，而AOL数据集的数据分布则要更为广泛，这导致UTCG在进行prompt生成的时候无法很好地生成符合控制条件的prompt。</p><p>Figure 1展示了UTCG框架不同微调和改变生成模块模型大小在不同测试数据量下的文本生成效果，通过控制其他模块不变，只改变生成模块GPT-2模型的大小，可以看出base大小下的UTCG整个的文本生成效果要明显好于distil大小下的UTCG，同时在不经过UTCG框架微调之前，base GPT-2的生成效果本身就要比distil GPT-2的效果要好，这说明在整个UTCG框架中，不同效果的模型作为生成模块会对整个UTCG框架的效果产生不同的影响，并且可以推断，越是效果好的模型作为生成模块，UTCG提示微调框架对模型效果的提升就越明显。另外，作用于不同大小的GPT-2，使用UTCG微调框架都取得了明显的提升，这也说明了UTCG微调效果的通用性和普适性。</p><p>Figure 2展示了UTCG微调框架和常规的两种prompt微调方法的对比效果。从实验结果可以看出，经过hard prompt微调后的模型效果较原模型有少量提升，但是经过soft prompt微调之后的模型效果却有所下降，UTCG微调框架的效果则有明显提升，原因有以下几种: 1) hard prompt和soft prompt的微调效果都依赖于所微调的模型效果本身，对于参数量很大的大模型，hard prompt和soft prompt能够在其基础上产生好的效果，但在本实验中GPT-2本身在电商特定领域数据集效果就不如在通用数据集上效果好，所以hard prompt和soft prompt在其基础之上就很难有较好的效果的提升 2)UTCG控制模块生成的提示向量是在用户历史行为数据作为反馈信号下生成的高维特征向量，该提示向量具有更准确的特征提示，所以尽管GPT-2模型对电商数据集不太熟悉，但依然能够对GPT-2模型起到文本控制生成的作用。</p><p>Figure 3展示了对UTCG控制模块的loss函数进行修改之后的效果对比。从基尼指数上来看，控制模块多loss生成的提示向量对GPT-2模型进行微调之后，在基尼指数上有明显的下降，这说明控制模块多loss下生成的提示向量能够对GPT-2模型产生相对应的控制效果，该消融实验也证明了UTCG框架的更深层次的价值，通过更换UTCG中控制模块的loss函数，控制模块便可以生成具有相对应的控制作用的提示向量，并对GPT-2模型产生控制作用。</p><p>Figure 3是使用了T-SNE对1000条数据和embedding 向量进行聚类和可视化，通过可视化的结果可以看出，对于1000条数据根据距离远近形成若干个小的簇，而每个簇代表了用户在输入前几个词时的用户偏好，以Figure5的左下角来举例，图中左下角形成了一个明显的簇，通过每个点对应的用户和用户输入信息来看，该簇包含了用户2907007597.0输入词是炸鸡提示词是、用户1533072098.0输入词是黄焖鸡提示词是、用户613293787.0输入词是炸鸡提示词是、用户40962466.0输入词是猪肚鸡提示词是等文本，从文本内容上来看，聚集到一起的embedding向量对应的用户输入都是跟鸡肉相关的食物，而且这几个用户的历史点击也是主要跟食物相关，这也再次验证了UCTG框架中控制模块对用户的爱好建模与人的普遍认知是一致，也再次说明了控制模块生成的embedding具有实际的意义，并且能够对GPT-2进行提示进而控制文本的生成。</p><p>Figure 4是使用了UMAP(Uniform Manifold Approximation and Projection)，一种高维数据将为算法，对1000条文本数据和embedding进行可视化展示，UMAP相对于T-SNE能反映全局结构。从降维可视化的图中可以看出，尽管更换了可视化的算法，”用户2907007597.0输入词是炸鸡提示词是“、”用户2561854230.0输入词是烤鸡提示词是“，”用户2270230980输入词是鸡汤提示词是“等还是聚集到了一起，从这些文本中可以看出，输入词主要也是跟食物相关，并且这几个用户的历史点击也表明其偏好特点在食物方面</p><p>从上述两个聚类\降维算法得到的可视化结果可以看出，UCTG框架中控制模块的到的高维向量确实表征了用户的行为偏好和特点，这也验证了在具体试验中UCTG微调之后的模型效果明显的提升确实是由于提示向量的提示作用。</p><p>我们提出的UCTG框架由两个阶段组成：（i）用下游任务数据集预训练GPT-2模型和BERT模型 和（ii）提示调优。这两个阶段的优化使得UCTG框架在前一个阶段GPT-2学习下游领域的相关信息，BERT模型学习到用户的偏好和query出现的频次特点，然后在后一个阶段中利用BERT模型抽取出来的高维向量去微调GPT-2的文本生成，从而使得GPT-2模型能够生成对应控制效果的。</p><p>具体而言，在预训练阶段，GPT-2模型的参数和BERT模型的参数是发生改变的，这是因为GPT-2模型需要在下游数据上进行参数更新以学习到下游数据中的新的信息，BERT模型需要通过对用户行为反馈数据和Query出现的频次特点进行参数更新以便能抽取出具有高维特征的向量。并且，为了后续调优阶段中BERT模型抽取的向量更好地匹配GPT-2的语义空间，需要控制GPT-2模型的vocab与BERT模型的vocab一致。之后，在提示调优阶段，有两种参数更新方式，i)GPT-2模型的参数冻结，提示模块中的参数更新，进一步调整提示向量以适应下游领域任务。ii)GPT-2模型的参数和提示模块中的参数一同更新以更加完美地适应下游领域任务。</p><p>用户3170313953.0输入词是炸鸡提示词是、用户980125838.0输入词是参鸡提示词是、、用户277412824.0输入词是黄焖鸡提示词是、用户2561854230.0输入词是烤鸡提示词是、用户1885650741.0输入词是烧鸡公提示词是、用户3652156408.0输入词是白切鸡提示词是、用户1189562967.0输入词是火锅鸡提示词是、用户3155472689.0输入词是鸡精提示词是、用户412329645.0输入词是凉拌鸡提示词是、用户951668225.0输入词是蛙蛙鸡提示词是、用户3678392590.0输入词是瑶鸡提示词是、用户3803971217.0输入词是鸡提示词是、用户312910262.0输入词是黄焖鸡提示词是、用户700332224.0输入词是猪肚鸡提示词是</p><h3 id="曝光度计算指标"><a href="#曝光度计算指标" class="headerlink" title="曝光度计算指标"></a>曝光度计算指标</h3><p>生成式模型有个很大的问题就是,生成内容容易受训练数据中的文本频率影响,所以需要控制某个商家的曝光率,以及整个推荐的覆盖率和多样性</p><p>所以说,在生成式场景下,马太效应会更加明显</p><h4 id="1-七猫小说推荐系统的做法"><a href="#1-七猫小说推荐系统的做法" class="headerlink" title="1. 七猫小说推荐系统的做法"></a>1. <a href="https://tech.qimao.com/zhi-neng-pu-guang-da-ya-ce-lue-de-tan-suo-yu-shi-jian/">七猫小说推荐系统的做法</a></h4><p>添加了6个特征进行模型的训练</p><table><thead><tr><th>用户该书30内书籍曝光次数</th><th></th></tr></thead><tbody><tr><td>userbook_show_count_14</td><td>用户该书14内书籍曝光次数</td></tr><tr><td>userbook_show_count_7</td><td>用户该书7内书籍曝光次数</td></tr><tr><td>userbook_click_count_30</td><td>用户该书30内书籍点击次数</td></tr><tr><td>userbook_click_count_14</td><td>用户该书14内书籍点击次数</td></tr><tr><td>userbook_click_count_7</td><td>用户该书7内书籍点击次数</td></tr></tbody></table><h3 id="2-覆盖率与基尼系数"><a href="#2-覆盖率与基尼系数" class="headerlink" title="2. 覆盖率与基尼系数"></a>2. 覆盖率与基尼系数</h3><p>覆盖率用来衡量推荐的物品占总物品的比例<br>$$<br>Coverage &#x3D; \frac{推荐的物品数}{总物品数}<br>$$<br>基尼系数描述的是物品流行度的分布趋势<br>$$<br>G&#x3D;1-\frac{1}{n}\left(2 \sum_{i&#x3D;1}^{n-1} w_i+1\right)<br>$$</p><h3 id="3-商品出现次数"><a href="#3-商品出现次数" class="headerlink" title="3. 商品出现次数"></a>3. 商品出现次数</h3><p>统计某个商品在一段时间内的出现次数占所有出现次数的比值作为该商品的曝光度</p><p>或者是基于历史数据算出某个商品下次出现的概率作为商品的曝光度, 可以使用贝叶斯概率计算</p><h1 id="评审意见"><a href="#评审意见" class="headerlink" title="评审意见"></a>评审意见</h1><h2 id="写作问题"><a href="#写作问题" class="headerlink" title="写作问题"></a>写作问题</h2><ol><li><p>Authors made several expiations for their experiment results, but from the results, it contradicts what authors explained.</p></li><li><p>In addition, authors observed the contradict result when comparing soft prompt and hard prompt, the explanation was not quite convincible.</p></li><li><p>Selected architecture is not well motivated compared to similar more flexible approaches like RAG</p></li><li><p>missed an important span of work that would have beeen totally relevant for the presented use-case</p><blockquote><p><strong>Learning to Write with Cooperative Discriminators</strong></p><blockquote></blockquote></blockquote></li><li><p>This paper is not well-written and not presented effectively in appropriate format. Some typos are found and also the presentation of figures (like Figure 3) can be improved.</p></li><li><p>There are some typos in the paper, i.e. in section 3.2 first paragraph, Figure index was missing.</p></li></ol><h2 id="实验问题"><a href="#实验问题" class="headerlink" title="实验问题"></a>实验问题</h2><ol><li><p>Since this is a framework, authors should present more variety datasets to prove this framework work on different domains and datasets, only one specific domain which cannot persuade audience to believe this framework will work for other domains or tasks.</p></li><li><p>experiments section heavily focuses on different variations of the same method</p></li><li><p>designed architecture is not flexible and would require retraining given changes in base models</p></li><li><p>outdated generative model (GPT2) in the experiments make the reader wonder what would be the results with more capable and versatile generative models</p></li><li><p>failed to showcase the flexibility of the approach: flexibility is cited as an advantage of the approach, but not highlighted in the experiments</p></li><li><p>More recent baselines can be chosen. The paper lacks comparisons and discussions with widely-known baselines in the field, which hinders the assessment of the novelty and performance of UCTG.</p></li><li><p>This paper is not well-written and not presented effectively in appropriate format. Some typos are found and also the presentation of figures (like Figure 3) can be improved.</p></li><li><p>作者对他们的实验结果进行了多次解释，但从结果来看，这与作者所解释的内容相矛盾。</p></li><li><p>此外，作者在比较软提示和硬提示时观察到了矛盾的结果，他们的解释并不十分令人信服。</p></li><li><p>所选择的架构与类似更灵活的方法（如RAG）相比，缺乏充分的论证。</p></li><li><p>遗漏了一段重要的工作，这些工作对于所展示的用例来说完全相关。</p></li><li><p>这篇论文写作不佳，且没有以适当的格式有效地呈现。文中发现了一些错别字，同时图表的展示（如图3）也有待改进。</p></li><li><p>论文中存在一些错别字，例如在第3.2节的第一段中，图的索引缺失。</p></li><li><p><strong>由于这是一个框架，作者应该展示更多种类的数据集，以证明该框架能够在不同领域和数据集上工作，仅有一个特定领域无法说服读者相信该框架适用于其他领域或任务。</strong></p></li><li><p><strong>实验部分过分关注同一方法的不同变体</strong>。</p></li><li><p><strong>设计的架构不够灵活，一旦基础模型发生变化，就需要重新训练</strong>。</p></li><li><p>在实验中使用的生成模型（GPT2）已经过时，这让读者好奇，如果使用更强大、更通用的生成模型，结果将会如何。</p></li><li><p><strong>未能展示方法的灵活性：灵活性被引用为该方法的优势，但在实验中并未突出显示。</strong></p></li><li><p>可以<strong>选择更近期的基线进行比较</strong>。论文缺乏与该领域广为人知的基线进行比较和讨论，这阻碍了对UCTG的新颖性和性能的评估。</p></li><li><p>这篇论文写作不佳，且没有以适当的格式有效地呈现。文中发现了一些错别字，同时图表的展示（如图3）也有待改进。</p></li></ol>]]>
    </content>
    <id>https://boywuxu.github.io/2024/04/02/prompt_QAC/</id>
    <link href="https://boywuxu.github.io/2024/04/02/prompt_QAC/"/>
    <published>2024-04-01T16:00:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="A-Controllable-Text-Generation-Framework-based-Prompt-learning-for-Query-Auto-completion"><a href="#A-Controllable-Text-Generation-Framework-based-Prompt-learning-for-Query-Auto-completion" class="headerlink" title="A Controllable Text Generation Framework based Prompt learning for Query Auto-completion"></a>A Controllable Text Generation Framework based Prompt learning for Query Auto-completion</h1><h3 id="论文思路"><a href="#论文思路" class="headerlink" title="论文思路"></a>论文思路</h3><p>研究领域是query自动补全（QAC），对应的显示场景是搜索栏的用户搜索场景，用的研究方法是生成式模型而非召回是模型（该领域常规的方法是先生成候选词，然后对候选词排序）</p>
<p>对于QAC领域，传统的召回式生成query仅仅通过候选词频率进行召回，缺乏对于query语意层面的理解，同时对于unseen 的输入，难以生成高质量的补全，以及召回式的生成难以充分实现个性化的生成</p>
<p><strong>其他生成模型的历史信息的局限性：时间跨度短，数据量比较少，</strong>随着NLP领域中NLG模型的发展，transformer系列的自然语言生成式模型在各个领域展现出巨大的潜力，而且像GPT2这样在大量无监督数据上训练的模型，拥有强大的语意理解能力，有越来越多的研究工作研究生成式模型用于QAC,生成式的模型能够有效应对上述的几个问题。（蹭大模型的热度，垂直领域生成模型）</p>
<p>对于GPT模型，我们使用提示学习来对GPT的生成做进一步的控制，来达到用户的个性化需求，通过使用提示学习对GPT进行微调，可以使GPT模型生成的query更加贴近用户偏好习惯，而传统上的提示学习包括hard提示和soft提示都是从自然语言语意层面对GPT的输出进行提示，而用户个人的消费行为习惯可能无法简单的从语言层面展现，而在使用bert模型进行语意理解和语意抽取进而进行下游任务的分类时，bert可以很好地进行高维度的特征表征，所以在本文中我们采用bert模型抽取高维度的用户个人特征表征作为GPT模型的提示，进而使GPT的输出达到个性化的要求。（特别的，bert和GPT使用统一词表来保证两个模型的高维映射空间是一致的）</p>
<h2 id="Abstract"><a href="#Abstract" class="headerlink" title="Abstract"></a>Abstract</h2><p>Query auto-completion (QAC) aims at suggesting plausible completions for a given query prefix. The recent QAC methods introduce Natural Language Generation to generate the completions for user input. </p>
<p>  However, NLG (Natural Lagnuage Generation) methods ususally output unsense or wrong words without controll. Moreover, A serious drawback of generative methods is that they can produce an ether effect. It severely affected the performance of the generative methods. </p>
<p>  We proposed a framework that controls the generation of queries using prompt learning methods, thereby making the generative methods controllable. This framework consists of three parts: the control module, the prompt module, and the generation module. The control module generates a prompt vector endowed with implicit features, then the prompt module ingests the prompt vector and user input into the generation module, and ultimately, the generation module generates the query under control. </p>]]>
    </summary>
    <title>prompt_QAC</title>
    <updated>2026-04-01T07:44:55.010Z</updated>
  </entry>
  <entry>
    <author>
      <name>无序</name>
    </author>
    <content>
      <![CDATA[<h1 id="程序员的数学2-概率统计"><a href="#程序员的数学2-概率统计" class="headerlink" title="程序员的数学2-概率统计"></a>程序员的数学2-概率统计</h1><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><ul><li>概率是面积与体积的泛化</li><li>随机变量是一种以变量为名的函数</li></ul>]]>
    </content>
    <id>https://boywuxu.github.io/2024/03/25/%E6%A6%82%E7%8E%87%E8%AE%BA/</id>
    <link href="https://boywuxu.github.io/2024/03/25/%E6%A6%82%E7%8E%87%E8%AE%BA/"/>
    <published>2024-03-24T16:00:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="程序员的数学2-概率统计"><a href="#程序员的数学2-概率统计" class="headerlink" title="程序员的数学2-概率统计"></a>程序员的数学2-概率统计</h1><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><ul>
<li>概率是面积与体积的泛化</li>
<li>随机变量是一种以变量为名的函数</li>
</ul>]]>
    </summary>
    <title>概率论</title>
    <updated>2026-04-01T07:44:55.021Z</updated>
  </entry>
  <entry>
    <author>
      <name>无序</name>
    </author>
    <content>
      <![CDATA[<p><a href="https://arxiv.org/abs/2310.11644"><strong>Open Information Extraction: A Review of Baseline Techniques, Approaches, and Applications</strong></a></p><p>开放域抽取综述</p><p><a href="https://arxiv.org/pdf/2310.19019.pdf">TeacherLM: Teaching to Fish Rather Than Giving the Fish, Language Modeling Likewise</a></p><p>Use “{Question} {Answer} {Fundamentals} {Chain of Thought} {Common Mistakes}” five-element training object for each sample. These sample to train a small model called TeacherLM to re-construct others training data to train or fine-tuning larger LLM</p><p><a href="https://arxiv.org/abs/2310.20127">Improving Prompt Tuning with Learned Prompting Layers </a></p><p>选择性prefix-tuning learning 由原来全部加个prefix 到 现在的选择性添加 prefix</p><p><a href="https://arxiv.org/pdf/2310.16045.pdf">Woodpecker: Hallucination Correction for Multimodal Large Language Models</a></p><p>Woodpecker的架构如下，它包括五个主要步骤:  关键概念提取、问题构造、视觉知识检验、视觉断言生成 以及幻觉修正。</p><p><a href="https://arxiv.org/abs/2310.08975">ChatKBQA: A Generate-then-Retrieve Framework for Knowledge Base Question Answering with Fine-tuned Large Language Models</a></p><p>微调大模型+知识图谱 <a href="https://github.com/LHRLAB/ChatKBQA">code link</a></p>]]>
    </content>
    <id>https://boywuxu.github.io/2024/03/24/good%20paper/</id>
    <link href="https://boywuxu.github.io/2024/03/24/good%20paper/"/>
    <published>2024-03-23T16:00:00.000Z</published>
    <summary>
      <![CDATA[<p><a href="https://arxiv.org/abs/2310.11644"><strong>Open Information Extraction: A Review of Baseline Techniques, Approaches, and Applications</strong></a></p>
<p>开放域抽取综述</p>
<p><a href="https://arxiv.org/pdf/2310.19019.pdf">TeacherLM: Teaching to Fish Rather Than Giving the Fish, Language Modeling Likewise</a></p>
<p>Use “{Question} {Answer} {Fundamentals} {Chain of Thought} {Common Mistakes}” five-element training object for each sample. These sample to train a small model called TeacherLM to re-construct others training data to train or fine-tuning larger LLM</p>
<p><a href="https://arxiv.org/abs/2310.20127">Improving Prompt Tuning with Learned Prompting Layers </a></p>
<p>选择性prefix-tuning learning 由原来全部加个prefix 到 现在的选择性添加 prefix</p>
<p><a href="https://arxiv.org/pdf/2310.16045.pdf">Woodpecker: Hallucination Correction for Multimodal Large Language Models</a></p>
<p>Woodpecker的架构如下，它包括五个主要步骤:  关键概念提取、问题构造、视觉知识检验、视觉断言生成 以及幻觉修正。</p>
<p><a href="https://arxiv.org/abs/2310.08975">ChatKBQA: A Generate-then-Retrieve Framework for Knowledge Base Question Answering with Fine-tuned Large Language Models</a></p>
<p>微调大模型+知识图谱 <a href="https://github.com/LHRLAB/ChatKBQA">code link</a></p>]]>
    </summary>
    <title>good paper</title>
    <updated>2026-04-01T07:44:55.004Z</updated>
  </entry>
  <entry>
    <author>
      <name>无序</name>
    </author>
    <content>
      <![CDATA[<h1 id="五步工作法："><a href="#五步工作法：" class="headerlink" title="五步工作法："></a>五步工作法：</h1><ol><li>质疑每项要求。提出任何一项要求时，都应该附上提出这一要求的人。永远不要接受一项来自某个部门的要求，比如来自“法务部门”或者“安全部门”的要求。你必须知道提出这项要求的人的名字。接下来你应该质疑它，不管这个人有多聪明。聪明人提出的要求才是最危险的，因为人们不太可能质疑他们。这件事要一直做下去，即便这项要求来自马斯克本人。质疑后，大家就要改进要求，让它变得不那么愚蠢。</li><li>删除要求当中所有你能删除的部分和流程，虽然你可能还得把它们加回来。事实上，你如果最后加回来的部分还不到删除部分的10%，那就说明你删减得还不够。</li><li>简化和优化。这应该放在第2步之后，因为人们常犯的错误就是简化和优化一个原本不应该存在的部分或者流程。</li><li>加快周转时间。每个流程都可以加快，但只有遵循了前三个步骤之后才能这么做。在特斯拉工厂，我错误地把很多精力花在加快生产流程上，后来我才意识到有些流程原本就应该被拿掉。</li><li>自动化。在内华达工厂和弗里蒙特工厂犯下的一个大错就是我一开始试图将每个步骤进行自动化改造。我们本应该先质疑所有要求，删除不必要的部分和流程，把问题筛出来、处理掉，然后再推进自动化。</li></ol><p>这套工作法有时还衍生出一些推论，包括：</p><ul><li>所有技术经理都必须有实战经验，比如说软件团队的管理人员必须至少花20%的时间进行编程，太阳能屋顶业务的经理必须花时间在屋顶上亲自做安装工作。否则光说不练，他们就像是不会骑马的骑兵队队长、不会舞刀弄枪的将军。</li><li>“你好，我好，大家好”是很危险的，人们会因此不再质疑同事的工作成果。人们天然有一种倾向是不想把要好的同事踢下船，而这种危险倾向一定要避免。</li><li>犯错没关系，但错了还不肯低头就不行。</li><li>永远不要要求你的团队做你自己都不愿意做的事。</li><li>每当有问题需要解决时，不要只与你直接管理的相关负责人聊。深入调研就要跨层级沟通，去跟你属下的属下直接交流吧。</li><li>招聘要招态度端正的人。技能是可以教的，但要扭转一个人的工作态度可就太费劲了，得给他“换个脑子”。</li><li>疯狂的紧迫感是我们公司运作的法则。</li><li>唯一要遵守的规则就是物理学定律能推导出来的规则，其他一切都只是建议。</li></ul><h1 id="如何高效率学习"><a href="#如何高效率学习" class="headerlink" title="如何高效率学习"></a>如何高效率学习</h1><h2 id="学习方法"><a href="#学习方法" class="headerlink" title="学习方法"></a>学习方法</h2><h3 id="费曼学习法"><a href="#费曼学习法" class="headerlink" title="费曼学习法"></a>费曼学习法</h3><p>费曼学习法的本质就是在于使用输出倒逼输入，通过讲自己以为明白了的东西以教别人的方式输出来达到验证自己，实际上是一个通过输出来发现缺陷和问题的过程，同时要求在教别人的时候用最通俗易懂的方式，这个要求本质上是要求把知识解构和重构的过程，也就是变成自己的东西，这个过程实际上就是利用了第一性原理，就是讲知识蒸馏，只剩下最根本的逻辑和公理，之后运用这套最基本的原理类的东西重构成一个新的案例。</p><p>感觉费曼学习法这一套流程中蕴含了其他几种学习原理，首先教会别人其实本质上就是知行合一的一种形式，教这个动作就是行，在教别人的时候遇到讲不通的地方，其实这个原理就是在行中发现问题，也只有行才能真正发现好问题，通过行发现的问题再回过头去学去搞明白，如此循环就是知行合一的体现。同时为什么选择教这个动作作为行而不是其他呢，这其实蕴含了其他原理在里面，就是第一性原理，其实也就是解构和重构的过程，因为教的对象是一个从来都没有接触过这方面的人，所以只能讲述最基本的原理，从而就可去掉一些附着的东西而直击本质，也就是第一性原理，而第一性原理也就是要抓住主要矛盾主要原理，去除掉不影响本质的东西，也就是解构，也叫解耦合，解构完成之后通过通俗易懂的表达教给别人，事先重构，也就是说，教这个动作能够让人在不经意间就完成解构和重构的过程。</p><p>知—&gt; 行—&gt; 第一性原理—&gt; 发现问题—&gt; 知</p><h3 id="第一性原理"><a href="#第一性原理" class="headerlink" title="第一性原理"></a>第一性原理</h3><p>本质是解构，换一种表达就是人们常说的透过现象看本质，将无关紧要的附着物抛开，只关注最本质最重要的部分，这个原理可以指导“行”。从最基本的原理或者逻辑出发，理解并改进。</p><h3 id="知行合一"><a href="#知行合一" class="headerlink" title="知行合一"></a>知行合一</h3><p>知者行之始，行者知之成。知和行本来就是同一个事物。仅仅学习而不去实践，便不是学习。</p><p>凡明不得、行不去，须反在自心上体当，即可通。</p><p>你不应先学习，再开始。<br>    而应先开始，再学习。     &#x2F; 萨希尔·拉文吉亚</p><h3 id="学会提出问题"><a href="#学会提出问题" class="headerlink" title="学会提出问题"></a>学会提出问题</h3><p>相比较回答问题，更重要的是提出问题，提出高质量的问题，如何提出高质量的问题，这就取决于对问题本质的认识</p><h3 id="体验式学习"><a href="#体验式学习" class="headerlink" title="体验式学习"></a>体验式学习</h3><p>要学什么，就要把自己放入学习目标产生实际效用的情境中，并且最好能够立刻看到目标对应的效果，拿到反馈</p><h3 id="制定有效目标"><a href="#制定有效目标" class="headerlink" title="制定有效目标"></a>制定有效目标</h3><p>目标越现实越好，越小越好，最好小到毫不费力</p><h3 id="克服完美注意，切忌大而全"><a href="#克服完美注意，切忌大而全" class="headerlink" title="克服完美注意，切忌大而全"></a>克服完美注意，切忌大而全</h3><h3 id="20分钟热身-1个小时左右的专注期"><a href="#20分钟热身-1个小时左右的专注期" class="headerlink" title="20分钟热身+1个小时左右的专注期"></a>20分钟热身+1个小时左右的专注期</h3><h3 id="拖延的本质是完美主义"><a href="#拖延的本质是完美主义" class="headerlink" title="拖延的本质是完美主义"></a>拖延的本质是完美主义</h3><h3 id="冥想、保持专注力"><a href="#冥想、保持专注力" class="headerlink" title="冥想、保持专注力"></a>冥想、保持专注力</h3><h3 id="慢就是快，提高效率就是日积月累"><a href="#慢就是快，提高效率就是日积月累" class="headerlink" title="慢就是快，提高效率就是日积月累"></a>慢就是快，提高效率就是日积月累</h3><h3 id="休息很重要"><a href="#休息很重要" class="headerlink" title="休息很重要"></a>休息很重要</h3><h2 id="模仿人物"><a href="#模仿人物" class="headerlink" title="模仿人物"></a>模仿人物</h2><h3 id="马斯克"><a href="#马斯克" class="headerlink" title="马斯克"></a>马斯克</h3><p>拥有清晰的目标、专注、第一性原理、三人行必有我师焉、跨学科学习、大量阅读</p><h3 id="费曼"><a href="#费曼" class="headerlink" title="费曼"></a>费曼</h3><p>兴趣、费曼学习法</p><h3 id="蔡志忠"><a href="#蔡志忠" class="headerlink" title="蔡志忠"></a>蔡志忠</h3><p>终身阅读、主题性阅读，先设定一个主题，然后去阅读</p><p>看书应该像构筑房子般</p><h3 id="山姆-奥特曼"><a href="#山姆-奥特曼" class="headerlink" title="山姆 奥特曼"></a>山姆 奥特曼</h3><ol><li><p><strong>跨领域学习</strong> </p><p>不要局限于自己的领域学习。 从不相关的领域中获得灵感，并将其应用于自己的领域。 最具创新的解决方案常常是不同学科的交叉融合。</p></li><li><p><strong>建立学习仪式</strong></p><p>每天花时间专注于学习。建立一个有规律的习惯，可以是： </p><p>• 每天早上阅读一个小时 </p><p>• 上班途中收听播客 </p><p>• 晚上上在线课程 </p><p>深度工作需要持之以恒。</p></li><li><p><strong>发挥科技的作用</strong></p><p>我们生活在一个信息超载的时代。利用人工智能工具整合信息。 跟随新的学习科技发展。 如果不利用科技，你将被抛在后面。</p></li><li><p><strong>建立强大的个人网络</strong> </p><p>人际关系是学习的乘数效应。建立一个强大的合作伙伴网络。</p></li><li><p><strong>寻找可以指导和挑战你的导师。反过来，慷慨地帮助他人</strong>。</p><p> 一个强大的网络可以使你接触新的观点和学习机会。</p></li><li><p><strong>培养专注力</strong> </p><p>25岁以上的成年人的神经系统储存新信息的空间较小。 强迫你的大脑接受新的模式：</p><p> • 不要多任务 </p><p>• 集中精力工作 </p><p>• 远离电视和手机等干扰</p></li><li><p><strong>充满好奇心</strong> </p><p>追求那些你深深着迷的话题，而不仅仅是流行的话题。 任何领域中最成功的人都是最好奇的人。 读书是为了满足你的求知欲望，而不是为了炫耀或完成的缘故。</p></li><li><p><strong>应用你所学的知识</strong> </p><p>知识如果不应用只会导致停滞不前。学到新知识后，要问问自己： </p><p>• 我如何应用这个概念？ </p><p>• 我可以用这个做什么项目？</p><p>• 我如何教别人这个？ </p><p>应用是巩固理解的关键</p></li><li><p><strong>接受重复</strong> </p><p>在注意力不集中的时代，重复对于保持新知识至关重要。 建立系统，反复接触知识，直到它深入你的记忆。 即使是天才也会反复学习同样的材料。</p></li><li><p><strong>教给他人</strong> </p><p>巩固你的理解最好的方法之一是将概念教给他人。当你可以解释一个想法时，这是真正的掌握。 通过： </p><p>• 写作 </p><p>• 指导 </p><p>• 公开演讲 </p><p>传授知识对学生和教师都有益处。</p></li><li><p><strong>学习销售</strong> </p><p>Altman称销售是“最重要的技能”。学会说服和沟通是至关重要的。 掌握传达自己想法的艺术。学会激励和激发他人。 销售对于创业者、员工和学者都是必不可少的。</p></li><li><p><strong>敢于显得愚蠢</strong> </p><p>对于很多人来说，害怕显得愚蠢是他们学习的绊脚石。 拥抱初学者的心态。提出天真的问题。承认自己不懂的事情。 为了学习的好处，放下自己的自尊是微不足道的代价。</p></li><li><p><strong>热爱过程</strong> </p><p>学习不仅仅是达到目的，而是目的本身。 热爱探索和成长的过程。培养对知识的真正热情。 学习的乐趣才是最终的回报。</p></li></ol><h1 id="如何高效率做一件事情"><a href="#如何高效率做一件事情" class="headerlink" title="如何高效率做一件事情"></a>如何高效率做一件事情</h1><h3 id="看清本质"><a href="#看清本质" class="headerlink" title="看清本质"></a>看清本质</h3><h3 id="学会提出问题-1"><a href="#学会提出问题-1" class="headerlink" title="学会提出问题"></a>学会提出问题</h3><p>看清本质是提出好问题的前提</p><h3 id="问题导向"><a href="#问题导向" class="headerlink" title="问题导向"></a>问题导向</h3><p>带着问题在资料中找答案</p><h3 id="迭代思想"><a href="#迭代思想" class="headerlink" title="迭代思想"></a>迭代思想</h3><p>做任何一件事情，最好的办法就是先有个初始解，然后进行迭代。</p><ol><li>不管多烂，先搞出来个初始解</li><li>找个可以提升的方向</li><li>结合自身能力，设置步长</li><li>不断重复2-3步，不断进行迭代</li></ol><h1 id="如何做笔记"><a href="#如何做笔记" class="headerlink" title="如何做笔记"></a>如何做笔记</h1><h3 id="三个原则可以帮助你有效地记笔记"><a href="#三个原则可以帮助你有效地记笔记" class="headerlink" title="三个原则可以帮助你有效地记笔记"></a>三个原则可以帮助你有效地记笔记</h3><ol><li><p>笔记必须符合你的思维方式</p><p>做笔记要按照自己的思考方式，不能原封不动地按照老师（或者书本）的讲解方式。这样不仅你写起来更轻松，而且将来回顾笔记的时候，你也更容易理解自己当时的想法。</p></li><li><p>笔记必须代表你的知识</p><p>笔记不要仅仅复制&#x2F;粘贴他人的话语，而要用自己的语言表达。你不妨标记清楚，哪些地方是已经理解的，哪些地方还没有理解或者有疑问。</p></li><li><p>笔记必须可以轻松检索</p><p>为了最大限度利用自己的笔记（其实也是节约自己的时间），它必须可以方便地检索。你要为每个部分写一个标题，并且定期整理出一份目录。</p></li></ol><h1 id="笛卡尔的思考秘籍："><a href="#笛卡尔的思考秘籍：" class="headerlink" title="笛卡尔的思考秘籍："></a>笛卡尔的思考秘籍：</h1><p>第一、从清楚明白、无需怀疑的公理开始；</p><p>第二、复杂事情切分成部分，切分到可以处理为止；</p><p>第三、按顺序思考、从最简单的着手；</p><p>第四、考虑问题要全面、列举完全。</p>]]>
    </content>
    <id>https://boywuxu.github.io/2024/03/15/%E6%95%88%E7%8E%87/</id>
    <link href="https://boywuxu.github.io/2024/03/15/%E6%95%88%E7%8E%87/"/>
    <published>2024-03-14T16:00:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="五步工作法："><a href="#五步工作法：" class="headerlink" title="五步工作法："></a>五步工作法：</h1><ol>
<li>质疑每项要求。提出任何一项要求时，都应该附上提出这一要求的人。永远不要接受一项来自某个部门的要求，比如来自“法务部门”或者“安全部门”的要求。你必须知道提出这项要求的人的名字。接下来你应该质疑它，不管这个人有多聪明。聪明人提出的要求才是最危险的，因为人们不太可能质疑他们。这件事要一直做下去，即便这项要求来自马斯克本人。质疑后，大家就要改进要求，让它变得不那么愚蠢。</li>
<li>删除要求当中所有你能删除的部分和流程，虽然你可能还得把它们加回来。事实上，你如果最后加回来的部分还不到删除部分的10%，那就说明你删减得还不够。</li>
<li>简化和优化。这应该放在第2步之后，因为人们常犯的错误就是简化和优化一个原本不应该存在的部分或者流程。</li>
<li>加快周转时间。每个流程都可以加快，但只有遵循了前三个步骤之后才能这么做。在特斯拉工厂，我错误地把很多精力花在加快生产流程上，后来我才意识到有些流程原本就应该被拿掉。</li>
<li>自动化。在内华达工厂和弗里蒙特工厂犯下的一个大错就是我一开始试图将每个步骤进行自动化改造。我们本应该先质疑所有要求，删除不必要的部分和流程，把问题筛出来、处理掉，然后再推进自动化。</li>
</ol>
<p>这套工作法有时还衍生出一些推论，包括：</p>
<ul>
<li>所有技术经理都必须有实战经验，比如说软件团队的管理人员必须至少花20%的时间进行编程，太阳能屋顶业务的经理必须花时间在屋顶上亲自做安装工作。否则光说不练，他们就像是不会骑马的骑兵队队长、不会舞刀弄枪的将军。</li>
<li>“你好，我好，大家好”是很危险的，人们会因此不再质疑同事的工作成果。人们天然有一种倾向是不想把要好的同事踢下船，而这种危险倾向一定要避免。</li>
<li>犯错没关系，但错了还不肯低头就不行。</li>
<li>永远不要要求你的团队做你自己都不愿意做的事。</li>
<li>每当有问题需要解决时，不要只与你直接管理的相关负责人聊。深入调研就要跨层级沟通，去跟你属下的属下直接交流吧。</li>
<li>招聘要招态度端正的人。技能是可以教的，但要扭转一个人的工作态度可就太费劲了，得给他“换个脑子”。</li>
<li>疯狂的紧迫感是我们公司运作的法则。</li>
<li>唯一要遵守的规则就是物理学定律能推导出来的规则，其他一切都只是建议。</li>
</ul>
<h1 id="如何高效率学习"><a href="#如何高效率学习" class="headerlink" title="如何高效率学习"></a>如何高效率学习</h1><h2 id="学习方法"><a href="#学习方法" class="headerlink" title="学习方法"></a>学习方法</h2><h3 id="费曼学习法"><a href="#费曼学习法" class="headerlink" title="费曼学习法"></a>费曼学习法</h3><p>费曼学习法的本质就是在于使用输出倒逼输入，通过讲自己以为明白了的东西以教别人的方式输出来达到验证自己，实际上是一个通过输出来发现缺陷和问题的过程，同时要求在教别人的时候用最通俗易懂的方式，这个要求本质上是要求把知识解构和重构的过程，也就是变成自己的东西，这个过程实际上就是利用了第一性原理，就是讲知识蒸馏，只剩下最根本的逻辑和公理，之后运用这套最基本的原理类的东西重构成一个新的案例。</p>
<p>感觉费曼学习法这一套流程中蕴含了其他几种学习原理，首先教会别人其实本质上就是知行合一的一种形式，教这个动作就是行，在教别人的时候遇到讲不通的地方，其实这个原理就是在行中发现问题，也只有行才能真正发现好问题，通过行发现的问题再回过头去学去搞明白，如此循环就是知行合一的体现。同时为什么选择教这个动作作为行而不是其他呢，这其实蕴含了其他原理在里面，就是第一性原理，其实也就是解构和重构的过程，因为教的对象是一个从来都没有接触过这方面的人，所以只能讲述最基本的原理，从而就可去掉一些附着的东西而直击本质，也就是第一性原理，而第一性原理也就是要抓住主要矛盾主要原理，去除掉不影响本质的东西，也就是解构，也叫解耦合，解构完成之后通过通俗易懂的表达教给别人，事先重构，也就是说，教这个动作能够让人在不经意间就完成解构和重构的过程。</p>
<p>知—&gt; 行—&gt; 第一性原理—&gt; 发现问题—&gt; 知</p>]]>
    </summary>
    <title>效率</title>
    <updated>2026-04-01T07:44:55.018Z</updated>
  </entry>
  <entry>
    <author>
      <name>无序</name>
    </author>
    <content>
      <![CDATA[<h2 id="LLM的对齐、幻觉和可控文本生成"><a href="#LLM的对齐、幻觉和可控文本生成" class="headerlink" title="LLM的对齐、幻觉和可控文本生成"></a>LLM的对齐、幻觉和可控文本生成</h2><p>弄清楚关于大模型的对齐、幻觉和可控文本生成三者的含义，并区分三者的区别和重合之处，并对三者的技术解决方案进行阐述以及目前已有的技术解决方案存在的改进空间。</p><h3 id="LLM-的对齐（Alignment）"><a href="#LLM-的对齐（Alignment）" class="headerlink" title="LLM 的对齐（Alignment）"></a><a href="https://arxiv.org/pdf/2403.04204.pdf">LLM 的对齐（Alignment）</a></h3><p><strong>定义</strong>：对齐是指使模型符合人类的偏好和价值观</p><p><strong>解决方案</strong>：</p><ol><li>强化学习：RLHF</li></ol><p><strong>优点：</strong>泛化效果好</p><p><strong>缺点</strong>：不稳定的训练效率和数据利用率</p><ol start="2"><li>有监督微调：指令微调、RRHF</li></ol><p><strong>优点</strong>：训练效率高，收敛快</p><p><strong>缺点</strong>：泛化性差</p><ol start="3"><li>上下文学习：prompt engineer、RAG</li></ol><p><strong>优点</strong>：很小的对齐tax</p><p><strong>缺点</strong>：效果依靠模型的能力，难以应用到不同场景</p><h3 id="LLM的幻觉（Hallucination）"><a href="#LLM的幻觉（Hallucination）" class="headerlink" title="LLM的幻觉（Hallucination）"></a><a href="https://arxiv.org/abs/2311.05232">LLM的幻觉（Hallucination）</a></h3><p><strong>定义</strong>：幻觉是一种现象，指生成无意义和不忠于原内容的文本</p><p><strong>分类</strong></p><ol><li>事实性幻觉<ol><li>事实不一致</li><li>事实捏造</li></ol></li><li>忠实性幻觉<ol><li>指令不一致</li><li>上下文不一致</li><li>逻辑不一致</li></ol></li></ol><p><strong>原因</strong></p><ol><li>领域知识缺陷</li><li>过时的信息</li><li>记忆化</li><li>遗忘</li><li>推理失败</li></ol><p>缓解事实性幻觉的方法叫做<strong>知识注入</strong>（不是教授全新的知识，而是通过诱导偏见来刷新记忆）</p><p>知识注入分为两种：</p><ol><li>上下文学习（主要是RAG）</li><li>微调<ol><li>指令微调</li><li>强化学习</li><li>无监督微调（连续预训练）</li></ol></li><li>模型编辑</li></ol><p>RAG的挑战</p><ol><li>上下文长度</li><li>鲁棒性</li><li>如何与微调协同</li><li>LLM的角色</li><li>时延和泄漏</li></ol><h3 id="LLM的可控文本生成（Controllable-Text-Generation）"><a href="#LLM的可控文本生成（Controllable-Text-Generation）" class="headerlink" title="LLM的可控文本生成（Controllable Text Generation）"></a>LLM的可控文本生成（Controllable Text Generation）</h3><p><strong>定义</strong>：可控文本生成是指能够指导模型按照特定的要求或条件生成文本。这包括控制文本的风格、情感、主题、长度等属性。</p><h3 id="对齐、幻觉和可控文本生成的对比和关系"><a href="#对齐、幻觉和可控文本生成的对比和关系" class="headerlink" title="对齐、幻觉和可控文本生成的对比和关系"></a>对齐、幻觉和可控文本生成的对比和关系</h3><p>对齐关注的是模型输出的道德和社会可接受性，幻觉关注的是模型输出的准确性和真实性，而可控文本生成关注的是模型输出的定制化和用户需求的满足。</p><p>这三者在实践中是相互关联的。为了实现可控文本生成，模型需要在对齐的基础上避免幻觉，确保生成的内容既符合用户的期望，又准确无误。同时，对齐和幻觉的解决也有助于提高可控文本生成的质量，因为用户期望的输出首先应该是真实和合理的。</p><p>例子：</p><p>人类命令LLM跑步去将地上的苹果捡起来</p><p>对齐：LLM确实是去捡东西了，可能捡错对象或者没捡起来，但是确实是去捡东西了，而不是去把苹果踩碎，与人类的命令一致</p><p>幻觉：LLM将梨捡起来了</p><p>可控文本生成：LLM确实是将苹果捡起来了，但是不是跑过去的，是爬过去的或者跳过去的</p><h3 id="一些想法"><a href="#一些想法" class="headerlink" title="一些想法"></a>一些想法</h3><ol><li>推理即微调</li><li>通过改变训练数据的顺序来进行对齐</li><li>幻觉与创新：探索模型在生成新颖和创造性内容时产生幻觉的界限，以及如何在保持创造性的同时减少幻觉。</li><li>个性化对齐（人性化大模型）</li><li>模型编辑</li></ol>]]>
    </content>
    <id>https://boywuxu.github.io/2024/03/10/%E5%AF%B9%E9%BD%90%E3%80%81%E5%B9%BB%E8%A7%89%E3%80%81%E5%8F%AF%E6%8E%A7%E6%96%87%E6%9C%AC%E7%94%9F%E6%88%90/</id>
    <link href="https://boywuxu.github.io/2024/03/10/%E5%AF%B9%E9%BD%90%E3%80%81%E5%B9%BB%E8%A7%89%E3%80%81%E5%8F%AF%E6%8E%A7%E6%96%87%E6%9C%AC%E7%94%9F%E6%88%90/"/>
    <published>2024-03-09T16:00:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="LLM的对齐、幻觉和可控文本生成"><a href="#LLM的对齐、幻觉和可控文本生成" class="headerlink" title="LLM的对齐、幻觉和可控文本生成"></a>LLM的对齐、幻觉和可控文本生成</h2><p>弄清楚关于大模型的对齐、幻觉和可控文本生成三者的含义，并区分三者的区别和重合之处，并对三者的技术解决方案进行阐述以及目前已有的技术解决方案存在的改进空间。</p>
<h3 id="LLM-的对齐（Alignment）"><a href="#LLM-的对齐（Alignment）" class="headerlink" title="LLM 的对齐（Alignment）"></a><a href="https://arxiv.org/pdf/2403.04204.pdf">LLM 的对齐（Alignment）</a></h3><p><strong>定义</strong>：对齐是指使模型符合人类的偏好和价值观</p>
<p><strong>解决方案</strong>：</p>
<ol>
<li>强化学习：RLHF</li>
</ol>
<p><strong>优点：</strong>泛化效果好</p>
<p><strong>缺点</strong>：不稳定的训练效率和数据利用率</p>
<ol start="2">
<li>有监督微调：指令微调、RRHF</li>
</ol>
<p><strong>优点</strong>：训练效率高，收敛快</p>]]>
    </summary>
    <title>对齐、幻觉、可控文本生成</title>
    <updated>2026-04-01T07:44:55.006Z</updated>
  </entry>
  <entry>
    <author>
      <name>无序</name>
    </author>
    <content>
      <![CDATA[<h2 id="软件"><a href="#软件" class="headerlink" title="软件"></a>软件</h2><p><a href="https://github.com/jianchang512/clone-voice">clone-voice</a></p><p>一个带web界面的声音克隆工具，使用你的音色或任意声音来录制音频</p><hr><p><a href="https://github.com/slashbaseide/slashbase#installation">Modern database IDE for your dev &amp; data workflows. Supports MySQL, PostgreSQL &amp; MongoDB.</a></p><p>Slashbase是一个开源的现代数据库IDE，适用于您的开发&#x2F;数据工作流。使用Slashbase连接到任何数据库，浏览数据和模式，编写，运行和保存查询，创建图表。支持MySQL、PostgreSQL和MongoDB。</p><hr><p><a href="https://codeium.com/">codeium</a></p><p>AI写代码插件</p><hr><p><a href="https://www.cpolar.com/">内网穿透软件</a></p><hr><p><a href="https://github.com/syncthing/syncthing">syncthing</a></p><p>开源的连续文件同步</p><hr><p><a href="https://github.com/massgravel/Microsoft-Activation-Scripts">windows&#x2F;office激活工具</a></p><hr><p><a href="https://archlinux.org/packages/extra/x86_64/dbeaver/">dbeaver</a></p><p>数据库连接工具，主打免费可连接多种数据库</p><hr><p><a href="https://github.com/nadermx/backgroundremover">backgroundremover</a></p><p>去除图像和视频的背景，它是命令行工具，方便批量处理和脚本编程。</p><hr><p><a href="https://github.com/hiroi-sora/Umi-OCR">Umi-OCR</a></p><p>OCR图片转文字识别软件，完全离线。截屏&#x2F;批量导入图片，支持多国语言、合并段落、竖排文字。可排除水印区域，提取干净的文本。基于 PaddleOCR </p><hr><p><a href="https://localsend.org/#/">LocalSend</a></p><p>将文件共享到附近的设备。免费、开源、跨平台。</p><hr><p><a href="https://wolicheng.com/womic/download.html">womic</a></p><p>WO Mic可以把你的手机变成电脑的麦克风。你不需要花一分钱去买一个小玩意。如果你选择无线传输，它是移动的。数以百万计的人安装了它，每天都在使用它进行通话，录音，语音遥控和许多其他活动。</p><hr><p><a href="https://github.com/btpf/Alexandria">Alexandria</a></p><p>使用Tauri、Epub.js和Typescript构建的极简跨平台电子书阅读器使用Tauri、Epub.js和Typescript构建的极简跨平台电子书阅读器</p><hr><p><a href="https://github.com/deadbeefsociety/sshfs">sshfs</a></p><p>连接到SSH服务器的网络文件系统客户端，将ssh服务器挂载到本地</p><hr><p><a href="https://github.com/ekzhang/sshx">sshx</a></p><p>通过Web快速、协作的实时终端共享</p><hr><p><a href="https://github.com/Nain57/Smart-AutoClicker">Smart-AutoClicker</a></p><p>An open-source auto clicker on images for Android</p><h2 id="网站"><a href="#网站" class="headerlink" title="网站"></a>网站</h2><p><a href="https://hiplot.cn/?lang=zh_cn">可视化工具</a></p><p>画出一些好看的数据分析图</p><hr><p><a href="https://game.hullqin.cn/">线上游戏合集</a></p><hr><p><a href="https://aicodeconvert.com/">AI Code Converter</a></p><p>将自然语言通过AI工具转化为Python代码</p><hr><p><a href="https://bbycroft.net/llm">LLM 可视化</a></p><img src="/images/image-20231208110130456.png" alt="image-20231208110130456" style="zoom:50%;" /><hr><p><a href="https://123apps.com/cn/">123apps</a></p><p>网站提供了一系列的小工具，包含分类：</p><ul><li>视频工具</li><li>音频工具</li><li>PDF 工具</li><li>转换器</li></ul><hr><p><a href="https://amymind.com/">AImind</a></p><p>AI思维导图网页绘制网站</p><hr><p><a href="https://jsonhero.io/">json</a></p><p>一个本地json浏览网站</p><hr><p><a href="https://ideogram.ai/">Ideogram</a></p><p>一个可以文字生成图形的网站，使用谷歌账号登录，目前免费，次数无限制</p><hr><p><a href="https://www.hello-algo.com/chapter_introduction/">计算机算法教学</a></p><p>挺不错的，有动画，有代码，有讲解</p><hr><p><a href="https://huggingface.co/spaces/Xenova/whisper-web">语音识别</a></p><hr><p><a href="https://huggingface.co/spaces/coqui/xtts">声音克隆</a></p><p>试过一次，效果一般</p><hr><p><a href="https://www.greatppt.com/">PPT模板下载</a></p><hr><p><a href="https://simpletex.cn/">simpletex</a></p><p>公式&#x2F;文档识别网站</p><hr><p><strong><a href="https://github.com/AmruthPillai/Reactive-Resume">Reactive-Resume</a></strong></p><p>一个独一无二的简历建设者，让您的隐私铭记在心。完全安全，可定制，便携，开源和永久免费。今天就试试吧</p><h2 id="项目"><a href="#项目" class="headerlink" title="项目"></a>项目</h2><p><a href="https://github.com/novoselrok/glance">glance</a></p><p>代码一览使用嵌入和PageRank突出显示代码的重要部分。</p><hr><p><a href="https://github.com/OthersideAI/self-operating-computer">self-operating-computer</a></p><p>使用与人类操作员相同的输入和输出，模型查看屏幕并决定一系列鼠标和键盘操作以达到目标。</p><hr><p><a href="https://github.com/Maplemx/Agently">Agently</a></p><p>Agently是一个开发框架，可以帮助开发人员快速构建AI代理原生应用程序。您可以创建一个AI代理实例，然后与它交互，就像下面这样用很少的代码调用函数一样。</p><p><a href="https://github.com/microsoft/qlib">qlib</a></p><p>Qlib是一个面向AI的量化投资平台，旨在将AI技术应用于量化投资中，从探索想法到实施生产，实现潜力，赋能研究，创造价值。Qlib支持多种机器学习建模范式。包括监督学习、市场动态建模和RL。</p><hr><p><a href="https://github.com/g1879/DrissionPage">DrissionPage</a></p><p>基于python的网页自动化工具。既能控制浏览器，也能收发数据包。可兼顾浏览器自动化的便利性和requests的高效率。功能强大，内置无数人性化设计和便捷功能。语法简洁而优雅，代码量少。</p><hr><p><a href="https://github.com/darlinghq/darling">darling</a></p><p>Darwin&#x2F;macOS emulation layer for Linux</p><hr><p><a href="https://github.com/facebookresearch/seamless_communication">seamless_communication</a></p><p>语音和文本翻译的SOTA基础模型</p><hr><p><a href="https://github.com/BeyonderXX/InstructUIE">InstructUIE</a></p><p>一个用于信息抽取的大语言模型，只需要进行少量数据的增量训练就可以在新的数据集上效果很好</p><hr><p><a href="https://github.com/Ma-Lab-Berkeley/CRATE">白盒Transformers</a></p><p>一个白盒Transformers的实现，有对应论文</p><hr><p><a href="https://github.com/OpenLLMAI/ChatPiXiu/tree/main">ChatPiXiu</a></p><p>里面有一些对大模型的调研，很详细很有用</p><hr><p><a href="https://github.com/luban-agi/Awesome-Domain-LLM">垂直领域大模型的集合</a></p><hr><p><a href="https://github.com/semitable/robotic-warehouse">多智能体强化学习环境 仓库运送环境模拟</a></p><hr><p><a href="https://github.com/jzhang38/TinyLlama/blob/main/README_zh-CN.md">1,1B的LLama, 适合，练手和熟悉大模型</a></p><hr><p><a href="https://github.com/Evil0ctal/Douyin_TikTok_Download_API">一个开箱即用的高性能异步抖音|TikTok数据爬取工具，支持API调用，在线批量解析及下载。</a></p><hr><p><a href="https://github.com/testerSunshine/12306">12306智能刷票，订票</a></p><hr><p><a href="https://github.com/mulaRahul/keyviz">Keyviz</a></p><p>Keyviz是一个免费的开源工具，可以实时可视化您的击键️和️鼠标动作</p><hr><p><strong><a href="https://github.com/argosopentech/argos-translate">argos-translate</a></strong></p><p>用Python编写的开源离线翻译库</p><hr><p><a href="https://github.com/wuyifan18/Awesome-Domain-LLM#awesome-domain-llm">Awesome Domain LLM</a></p><p>收集和梳理垂直领域的开源模型、数据集及评测基准。</p><hr><p><a href="https://huggingface.co/datasets/liwu/MNBVC">MNBVC</a></p><p>目前中文最大的开源数据集</p><hr><p><a href="https://github.com/jzhang38/TinyLlama">TinyLlama</a></p><p>TinyLlama项目是一个开放的奋进，在3万亿个token上预训练1.1B Llama模型</p><hr><p><a href="https://github.com/InternLM/xtuner/blob/main/README_zh-CN.md">xtuner</a></p><p>XTuner 是一个轻量级微调大语言模型的工具库</p><hr><p><a href="https://github.com/cckuailong/SuperAdapters">SuperAdapters</a></p><p>在所有平台上使用所有适配器微调所有LLM</p><hr><p><a href="https://github.com/cnstark/pytorch-docker">pytorch-docker</a></p><p>拉取pytorch+cuda的docker</p><hr><p><a href="https://github.com/jsvine/pdfplumber">pdfplumber</a></p><p>垂直PDF的详细信息，每一个字符，矩形，线，等等-并轻松提取文本和表格。</p><hr><p><a href="https://github.com/docusealco/docuseal">docusel</a></p><p>开源DocuSign替代方案。创建、填写和签署数字文档️</p><hr><p><strong><a href="https://github.com/paperless-ngx/paperless-ngx">paperless-ngx</a></strong></p><p>社区支持的无纸化增强版：扫描、索引和存档所有物理文档</p><hr><p><a href="https://github.com/SuperManito/LinuxMirrors">linuxMirrors</a></p><p>GNU&#x2F;Linux 一键更换系统软件源脚本</p><hr><p><a href="https://github.com/vacanza/python-holidays">python-holidays</a></p><p>处理假期的 Python 库。该项目支持动态生成国家&#x2F;地区和省份公布的法定节假日，可以快速地判断指定日期是否为节假日。</p><hr><p><a href="https://github.com/mherrmann/selenium-python-helium">selenium-python-helium</a></p><p>Selenium-python但更轻：Helium是用于Web自动化的最佳Python库。</p><hr><p><a href="https://github.com/mosaicml/llm-foundry">llm-foundry</a></p><p>大模型训练、微调、验证的框架，支持NVIDIA和AMD</p><hr><p><a href="https://github.com/jianchang512/pyvideotrans">pyvideotrans</a></p><p>将视频从一种语言翻译为另一种语言，并添加配音</p><hr><p><a href="https://github.com/garywill/linux-router">linux-router</a></p><p>将 Linux 作为路由器的脚本。这是一个 Linux 软路由器的 shell 脚本，它可以通过一条命令将 Linux 设备作为路由器，提供互联网共享、DNS 服务器、WiFi 热点等功能。</p><hr><p><a href="https://github.com/sun0225SUN/Awesome-Love-Code">Love_Code</a></p><p>表白代码收藏馆</p><hr><p><a href="https://github.com/mozilla-Ocho/llamafile">llamafile</a></p><p>通过一个文件运行大模型</p><hr><p><a href="https://github.com/rahulnyk/knowledge_graph">knowledge graph</a></p><p>将任何文本转换为知识图。这可以用于图增强生成或基于知识图的QnA(使用的是ollama中的模型和构造提示模板来进行抽取,,但是应用的场景是长文档)</p><hr><p><a href="https://github.com/allenai/papermage">papermage</a></p><p>PaperMage：用于处理、表示和操作视觉丰富的科学文档的统一工具包</p>]]>
    </content>
    <id>https://boywuxu.github.io/2024/03/10/%E6%94%B6%E9%9B%86/</id>
    <link href="https://boywuxu.github.io/2024/03/10/%E6%94%B6%E9%9B%86/"/>
    <published>2024-03-09T16:00:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="软件"><a href="#软件" class="headerlink" title="软件"></a>软件</h2><p><a href="https://github.com/jianchang512/clone-voice">clone-voice</a></p>
<p>一个带web界面的声音克隆工具，使用你的音色或任意声音来录制音频</p>
<hr>
<p><a href="https://github.com/slashbaseide/slashbase#installation">Modern database IDE for your dev &amp; data workflows. Supports MySQL, PostgreSQL &amp; MongoDB.</a></p>
<p>Slashbase是一个开源的现代数据库IDE，适用于您的开发&#x2F;数据工作流。使用Slashbase连接到任何数据库，浏览数据和模式，编写，运行和保存查询，创建图表。支持MySQL、PostgreSQL和MongoDB。</p>
<hr>
<p><a href="https://codeium.com/">codeium</a></p>
<p>AI写代码插件</p>
<hr>]]>
    </summary>
    <title>一些网站、软件和项目的收集</title>
    <updated>2026-04-01T15:20:19.511Z</updated>
  </entry>
  <entry>
    <author>
      <name>无序</name>
    </author>
    <content>
      <![CDATA[<ol><li>在训练大模型的时候，可以从一些老师的课程视频中将字幕识别下来，作为LLM的训练数据</li><li>历史告诉我们会怎么样，科学告诉我们怎么改变</li><li>一个预训练模型 在两批数据上训练，训练的顺序先后颠倒 得到的模型还是一样的吗（大模型的遗忘问题）</li><li>预训练模型的预训练数据的前后训练顺序对模型有影响吗</li><li>人类的所有创新都是排列组合</li><li>幻觉就是创新？</li><li>大模型如何在跟人类对话的同时进行训练，推理即微调, 实时更新</li><li>指令冲突时，大模型听哪个指令？</li></ol>]]>
    </content>
    <id>https://boywuxu.github.io/2024/03/05/%E7%81%B5%E5%85%89%E4%B9%8D%E7%8E%B0/</id>
    <link href="https://boywuxu.github.io/2024/03/05/%E7%81%B5%E5%85%89%E4%B9%8D%E7%8E%B0/"/>
    <published>2024-03-04T16:00:00.000Z</published>
    <summary>
      <![CDATA[<ol>
<li>在训练大模型的时候，可以从一些老师的课程视频中将字幕识别下来，作为LLM的训练数据</li>
<li>历史告诉我们会怎么样，科学告诉我们怎么改变</li>
<li>一个预训练模型 在两批数据上训练，训练的顺序先后颠倒 得到的模型还是一样的吗（大模型的遗忘问题）</li>
<li>预训练模型的预训练数据的前后训练顺序对模型有影响吗</li>
<li>人类的所有创新都是排列组合</li>
<li>幻觉就是创新？</li>
<li>大模型如何在跟人类对话的同时进行训练，推理即微调, 实时更新</li>
<li>指令冲突时，大模型听哪个指令？</li>
</ol>]]>
    </summary>
    <title>想法</title>
    <updated>2026-04-01T07:44:55.020Z</updated>
  </entry>
  <entry>
    <author>
      <name>无序</name>
    </author>
    <content>
      <![CDATA[<h1 id="寒武纪平台使用-先进研究院-李治澎"><a href="#寒武纪平台使用-先进研究院-李治澎" class="headerlink" title="寒武纪平台使用(先进研究院-李治澎)"></a>寒武纪平台使用(先进研究院-李治澎)</h1><h2 id="使用自带的镜像创建新环境"><a href="#使用自带的镜像创建新环境" class="headerlink" title="使用自带的镜像创建新环境"></a>使用自带的镜像创建新环境</h2><p>目前有的镜像包括pytorch和tensorflow</p><img src="/images/image-20240227103324985.png" alt="image-20240227103324985" style="zoom: 67%;" /><p>业务管理-&gt;开发环境-&gt;创建</p><img src="/images/image-20240227103524410.png" alt="image-20240227103524410" style="zoom: 50%;" /><p>创建完之后等待平台拉取镜像后，会出现一个正在运行的环境</p><p><img src="/images/image-20240227103823922.png" alt="image-20240227103823922"></p><p>点击查看能够看到新创建的环境的ssh连接，如下</p><img src="/images/image-20240227104043958.png" alt="image-20240227104043958" style="zoom:67%;" /><p>也可以直接点击环境名称进入在线的jupyter界面</p><img src="/images/image-20240227104126953.png" alt="image-20240227104126953" style="zoom:67%;" /><h2 id="环境使用（以pytorch-python3-6镜像为例）"><a href="#环境使用（以pytorch-python3-6镜像为例）" class="headerlink" title="环境使用（以pytorch_python3.6镜像为例）"></a>环境使用（以pytorch_python3.6镜像为例）</h2><p>在进入到容器实例(也就是上面创建的新环境)后，镜像中自带了一个已经配置好的寒武纪环境，在终端中分别输入下面两行命令启动寒武纪python环境（若使用pytorch_python3.7镜像则不需要这一步）</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">source /torch/venv3/pytorch/bin/activate</span><br><span class="line">export LD_LIBRARY_PATH=/torch/neuware_home/lib64:/usr/local/openmpi/lib</span><br></pre></td></tr></table></figure><p>之后终端就会出现(pytorch)为开头的python环境，如下</p><img src="/images/image-20240227104725617.png" alt="image-20240227104725617" style="zoom: 80%;" /><p>可以使用cnmon命令来查看显卡使用情况(类似于NVIDIA的nvidia-smi)</p><img src="/images/image-20240227104941137.png" alt="image-20240227104941137" style="zoom:67%;" /><p>以下是一个具体的使用torch的实际代码例子</p><p>因为容器内无法联网，所以下面例子中的数据集需要在本地提前下载好</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">train_set = mnist.MNIST(<span class="string">&#x27;./data&#x27;</span>,train=<span class="literal">True</span>,transform=data_tf,download=<span class="literal">True</span>)</span><br><span class="line">test_set = mnist.MNIST(<span class="string">&#x27;./data&#x27;</span>,train=<span class="literal">False</span>,transform=data_tf,download=<span class="literal">True</span>)</span><br></pre></td></tr></table></figure><p>然后将下面完整代码和数据集上传到容器中</p><p><img src="/images/image-20240227135854500.png" alt="image-20240227135854500"></p><p>在终端中输入下面的命令运行代码</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python mnist.py</span><br></pre></td></tr></table></figure><p>终端会输出训练的记录</p><img src="/images/image-20240227140117459.png" alt="image-20240227140117459" style="zoom:67%;" /><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> torch       <span class="comment">#导入原生PyTorch</span></span><br><span class="line"><span class="keyword">import</span> torch_mlu   <span class="comment">#导入Cambricon PyTorch Backend</span></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">from</span> torch.utils.data <span class="keyword">import</span> DataLoader</span><br><span class="line"><span class="keyword">from</span> torchvision.datasets <span class="keyword">import</span> mnist</span><br><span class="line"><span class="keyword">from</span> torch <span class="keyword">import</span> nn</span><br><span class="line"><span class="keyword">from</span> torch <span class="keyword">import</span> optim</span><br><span class="line"><span class="keyword">from</span> torchvision <span class="keyword">import</span> transforms</span><br><span class="line"><span class="keyword">from</span> torch.optim.lr_scheduler <span class="keyword">import</span> StepLR</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> torch.nn.functional <span class="keyword">as</span> F</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Net</span>(nn.Module):     <span class="comment">#定义模型</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="built_in">super</span>(Net, <span class="variable language_">self</span>).__init__()</span><br><span class="line">        <span class="variable language_">self</span>.conv1 = nn.Conv2d(<span class="number">1</span>, <span class="number">32</span>, <span class="number">3</span>, <span class="number">1</span>)</span><br><span class="line">        <span class="variable language_">self</span>.conv2 = nn.Conv2d(<span class="number">32</span>, <span class="number">64</span>, <span class="number">3</span>, <span class="number">1</span>)</span><br><span class="line">        <span class="variable language_">self</span>.dropout1 = nn.Dropout2d(<span class="number">0.25</span>)</span><br><span class="line">        <span class="variable language_">self</span>.dropout2 = nn.Dropout2d(<span class="number">0.5</span>)</span><br><span class="line">        <span class="variable language_">self</span>.fc1 = nn.Linear(<span class="number">9216</span>, <span class="number">128</span>)</span><br><span class="line">        <span class="variable language_">self</span>.fc2 = nn.Linear(<span class="number">128</span>, <span class="number">10</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">forward</span>(<span class="params">self, x</span>):   <span class="comment">#定义前向计算</span></span><br><span class="line">        x = <span class="variable language_">self</span>.conv1(x)</span><br><span class="line">        x = F.relu(x)</span><br><span class="line">        x = <span class="variable language_">self</span>.conv2(x)</span><br><span class="line">        x = F.relu(x)</span><br><span class="line">        x = F.max_pool2d(x, <span class="number">2</span>)</span><br><span class="line">        x = <span class="variable language_">self</span>.dropout1(x)</span><br><span class="line">        x = torch.flatten(x, <span class="number">1</span>)</span><br><span class="line">        x = <span class="variable language_">self</span>.fc1(x)</span><br><span class="line">        x = F.relu(x)</span><br><span class="line">        x = <span class="variable language_">self</span>.dropout2(x)</span><br><span class="line">        x = <span class="variable language_">self</span>.fc2(x)</span><br><span class="line">        output = F.log_softmax(x, dim=<span class="number">1</span>)</span><br><span class="line">        <span class="keyword">return</span> output</span><br><span class="line"></span><br><span class="line"><span class="comment">#模型训练</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">train</span>(<span class="params">model, train_data, optimizer, epoch</span>):</span><br><span class="line">    model = model.train()</span><br><span class="line">    <span class="keyword">for</span> batch_idx, (img, label) <span class="keyword">in</span> <span class="built_in">enumerate</span>(train_data):</span><br><span class="line">        img = img.to(torch.device(<span class="string">&#x27;mlu&#x27;</span>))</span><br><span class="line">        label = label.to(torch.device(<span class="string">&#x27;mlu&#x27;</span>))</span><br><span class="line">        optimizer.zero_grad()</span><br><span class="line">        out = model(img)</span><br><span class="line">        loss = F.nll_loss(out, label)</span><br><span class="line">        loss.backward()</span><br><span class="line">        optimizer.step()</span><br><span class="line">        <span class="keyword">if</span> batch_idx % <span class="number">100</span> == <span class="number">0</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&#x27;Train Epoch: &#123;&#125; [&#123;&#125;/&#123;&#125; (&#123;:.0f&#125;%)]\tLoss: &#123;:.6f&#125;&#x27;</span>.<span class="built_in">format</span>(</span><br><span class="line">                epoch, batch_idx * <span class="built_in">len</span>(img), <span class="built_in">len</span>(train_data.dataset),</span><br><span class="line">                <span class="number">100.</span> * batch_idx / <span class="built_in">len</span>(train_data), loss.item()))</span><br><span class="line"></span><br><span class="line"><span class="comment">#模型推理</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">validate</span>(<span class="params">val_loader, model</span>):</span><br><span class="line">    test_loss = <span class="number">0</span></span><br><span class="line">    correct = <span class="number">0</span></span><br><span class="line">    model.<span class="built_in">eval</span>()</span><br><span class="line">    <span class="keyword">with</span> torch.no_grad():</span><br><span class="line">        <span class="keyword">for</span> images, target <span class="keyword">in</span> val_loader:</span><br><span class="line">            images = images.to(torch.device(<span class="string">&#x27;mlu&#x27;</span>))</span><br><span class="line">            target = target.to(torch.device(<span class="string">&#x27;mlu&#x27;</span>))</span><br><span class="line">            output = model(images)</span><br><span class="line">            test_loss += F.nll_loss(output, target, reduction=<span class="string">&#x27;sum&#x27;</span>).item()</span><br><span class="line">            pred = output.argmax(dim=<span class="number">1</span>, keepdim=<span class="literal">True</span>)</span><br><span class="line">            pred = pred.cpu()</span><br><span class="line">            target = target.cpu()</span><br><span class="line">            correct += pred.eq(target.view_as(pred)).<span class="built_in">sum</span>().item()</span><br><span class="line">    test_loss /= <span class="built_in">len</span>(val_loader.dataset)</span><br><span class="line">    <span class="comment">#打印精度结果</span></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&#x27;\nTest set: Average loss: &#123;:.4f&#125;, Accuracy: &#123;&#125;/&#123;&#125; (&#123;:.0f&#125;%)\n&#x27;</span>.<span class="built_in">format</span>(</span><br><span class="line">        test_loss, correct, <span class="built_in">len</span>(val_loader.dataset),</span><br><span class="line">        <span class="number">100.</span> * correct / <span class="built_in">len</span>(val_loader.dataset)))</span><br><span class="line"></span><br><span class="line"><span class="comment">#主函数</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    data_tf = transforms.Compose(</span><br><span class="line">                [transforms.ToTensor(),</span><br><span class="line">                 transforms.Normalize([<span class="number">0.1307</span>],[<span class="number">0.3081</span>])])</span><br><span class="line"></span><br><span class="line">    <span class="comment">#获取本地数据集</span></span><br><span class="line">    train_set = mnist.MNIST(<span class="string">&#x27;./data&#x27;</span>,train=<span class="literal">True</span>,transform=data_tf,download=<span class="literal">True</span>)</span><br><span class="line">    test_set = mnist.MNIST(<span class="string">&#x27;./data&#x27;</span>,train=<span class="literal">False</span>,transform=data_tf,download=<span class="literal">True</span>)</span><br><span class="line"></span><br><span class="line">    train_data = DataLoader(train_set,batch_size=<span class="number">64</span>,shuffle=<span class="literal">True</span>)</span><br><span class="line">    test_data = DataLoader(test_set,batch_size=<span class="number">1000</span>,shuffle=<span class="literal">False</span>)</span><br><span class="line"></span><br><span class="line">    net_orig = Net()</span><br><span class="line">    net = net_orig.to(torch.device(<span class="string">&#x27;mlu&#x27;</span>))   <span class="comment">#模型拷贝到MLU设备</span></span><br><span class="line">    optimizer = optim.Adadelta(net.parameters(), <span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">    nums_epoch = <span class="number">10</span>   <span class="comment">#训练10个epoch</span></span><br><span class="line">    save_model = <span class="literal">True</span> <span class="comment">#训练完成后保存模型</span></span><br><span class="line"></span><br><span class="line">    scheduler = StepLR(optimizer, step_size=<span class="number">1</span>, gamma=<span class="number">0.7</span>)</span><br><span class="line">    <span class="keyword">for</span> epoch <span class="keyword">in</span> <span class="built_in">range</span>(nums_epoch):</span><br><span class="line">        train(net, train_data, optimizer, epoch)</span><br><span class="line">        validate(test_data, net)</span><br><span class="line"></span><br><span class="line">        scheduler.step()</span><br><span class="line">        <span class="keyword">if</span> save_model:  <span class="comment"># 将训练好的模型保存为model.pth</span></span><br><span class="line">            <span class="keyword">if</span> epoch == nums_epoch-<span class="number">1</span>:</span><br><span class="line">                checkpoint = &#123;<span class="string">&quot;state_dict&quot;</span>:net.state_dict(), <span class="string">&quot;optimizer&quot;</span>:optimizer.state_dict(), <span class="string">&quot;epoch&quot;</span>: epoch&#125;</span><br><span class="line">                torch.save(checkpoint, <span class="string">&#x27;model.pth&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&#x27;__main__&#x27;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><p>至此，AI Station 平台中自带的寒武纪环境已经可以使用，只需要在该python环境下使用python ***.py 即可运行相应的代码</p><h2 id="运行已有的pytorch代码"><a href="#运行已有的pytorch代码" class="headerlink" title="运行已有的pytorch代码"></a>运行已有的pytorch代码</h2><p>运行&#x2F;torch&#x2F;src&#x2F;catch&#x2F;tools&#x2F;torch_gpu2mlu.py脚本将自己原有的代码转化为可以在寒武纪显卡上可以运行的代码</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python /torch/src/catch/tools/torch_gpu2mlu.py --i /path/your/code/dir</span><br></pre></td></tr></table></figure><p>运行完上述代码之后，会在当前目录生成一个新的以_mlu为后缀的文件夹，之后只需要运行新文件夹中的代码即可</p><p><img src="/images/image-20240227193106401.png" alt="image-20240227193106401"></p><h2 id="运行大模型"><a href="#运行大模型" class="headerlink" title="运行大模型"></a>运行大模型</h2><p>以Chatglm-6b为例</p><p>首先下载Chatglm-6b的运行代码<a href="https://github.com/THUDM/ChatGLM-6B.git">https://github.com/THUDM/ChatGLM-6B.git</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/THUDM/ChatGLM-6B.git</span><br></pre></td></tr></table></figure><p>之后下载Chatglm-6b的模型权重，下载地址是<a href="https://huggingface.co/THUDM/chatglm-6b">https://huggingface.co/THUDM/chatglm-6b</a></p><p>可以使用命令直接下载，也可以手动下载</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git lfs <span class="built_in">clone</span> https://huggingface.co/THUDM/chatglm-6b</span><br></pre></td></tr></table></figure><blockquote><p>[!NOTE]</p><p>这里需要加一步操作，就是将权重文件中的modeling_chatglm.py 中的 所有的skip_init 函数修改，因为MLU不支持1.10的skip_init，具体如何修改可以参考如下</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#        self.query_key_value = skip_init(</span></span><br><span class="line"><span class="comment">#            torch.nn.Linear,</span></span><br><span class="line"><span class="comment">#            hidden_size,</span></span><br><span class="line"><span class="comment">#            3 * self.inner_hidden_size,</span></span><br><span class="line"><span class="comment">#            bias=bias,</span></span><br><span class="line"><span class="comment">#            dtype=params_dtype,</span></span><br><span class="line"><span class="comment">#        )</span></span><br><span class="line">        <span class="variable language_">self</span>.query_key_value = torch.nn.Linear(hidden_size, <span class="number">3</span> * <span class="variable language_">self</span>.inner_hidden_size, bias=bias)</span><br></pre></td></tr></table></figure></blockquote><p>然后将代码和模型权重全部上传到服务器上，可以使用sftp文件传输软件，如filezilla</p><p>通过脚本文件将Chatglm的代码转化为可以在寒武纪显卡上可以运行的</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python /torch/src/catch/tools/torch_gpu2mlu.py --i /path/to/ChatGLM-6B</span><br></pre></td></tr></table></figure><p>修改ChatGLM-6B_mlu文件夹代码中的模型权重路径</p><img src="/images/image-20240227205218081.png" alt="image-20240227205218081"  /><p>之后就可以在寒武纪显卡上运行Chatglm 6b 大模型</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python cli_demo.py</span><br></pre></td></tr></table></figure><p><img src="/images/image-20240228121032910.png" alt="image-20240228121032910"></p><p>显卡情况如下：</p><p><img src="/images/image-20240228121053187.png" alt="image-20240228121053187"></p><h2 id="镜像制作"><a href="#镜像制作" class="headerlink" title="镜像制作"></a>镜像制作</h2><p>可以先从<a href="https://sdk.cambricon.com/download?sdk_version=V1.15.0&component_name=PyTorch">寒武纪官网</a>下载已经配置好的镜像，然后在本地加载镜像进行二次修改，补充自己需要的软件或库文件，之后再上传到AI station平台进行使用，具体流程如下：</p><p>首先，从寒武纪官网下载制作好的镜像</p><p><img src="/images/image-20240228121636395.png" alt="image-20240228121636395"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget https://sdk.cambricon.com/static/PyTorch/MLU370_1.9_v1.17.0_X86_ubuntu20.04_python3.7_docker/pytorch-v1.17.0-torch1.9-ubuntu20.04-py37.tar.gz</span><br></pre></td></tr></table></figure><p>会在本地得到一个pytorch-v1.17.0-torch1.9-ubuntu20.04-py37.tar.gz的文件</p><p>之后在本地加载该镜像</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker load -i pytorch-v1.17.0-torch1.9-ubuntu20.04-py37.tar.gz</span><br></pre></td></tr></table></figure><p><img src="/images/image-20240228121934372.png" alt="image-20240228121934372"></p><p>之后查询当前已有的镜像，可以看到刚刚下载的镜像已经被载入，复制其 IMAGE_ID</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker image list</span><br></pre></td></tr></table></figure><p><img src="/images/image-20240228122039985.png" alt="image-20240228122039985"></p><p>运行docker镜像,规定好平台为linux,为x86-64架构CPU指令集</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run -it --platform linux/amd64 497a0473974f /bin/bash</span><br></pre></td></tr></table></figure><p><img src="/images/image-20240228122141384.png" alt="image-20240228122141384"></p><p>进入该镜像之后，便可以进行软件的安装，或者python环境的安装</p><p>安装完成之后，将运行中的容器(Container) 打包为一个新的镜像</p><p>首先查询当前docker内正在执行的进程，记住当前的CONTAINER_ID</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker ps</span><br></pre></td></tr></table></figure><p><img src="/images/image-20240228122259884.png" alt="image-20240228122259884"></p><p>将当前运行的容器提交成为一个镜像</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker commit c5cde0f5e319 pytorch_mlu_python3.7</span><br></pre></td></tr></table></figure><p><img src="/images/image-20240228122340835.png" alt="image-20240228122340835"></p><p>将本地镜像保存为一个可循环复用的备份</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker save pytorch_mlu_python3.7 | gzip &gt; mlu_pytorch_python3.7.tar.gz</span><br></pre></td></tr></table></figure><p><img src="/images/image-20240228122447755.png" alt="image-20240228122447755"></p><blockquote><p>[!NOTE]</p><p>该步骤会根据镜像的大小等待不同的时间，一般在十几分钟以上，请耐心等待</p></blockquote><p>完成后会在本地生成一个tar.gz后缀的文件</p><p><img src="/images/image-20240228122547813.png" alt="image-20240228122547813"></p><p>将本地tar包上传到AIStation，镜像管理&gt;导入</p><p><img src="/images/image-20240228122618169.png" alt="image-20240228122618169"></p><h1 id="FAQ"><a href="#FAQ" class="headerlink" title="FAQ"></a>FAQ</h1><h2 id="离线安装python库"><a href="#离线安装python库" class="headerlink" title="离线安装python库"></a>离线安装python库</h2><h3 id="第一步-在有网络的主机上下载库文件包"><a href="#第一步-在有网络的主机上下载库文件包" class="headerlink" title="第一步 在有网络的主机上下载库文件包"></a>第一步 在有网络的主机上下载库文件包</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip download -d ./path transformers==4.30.2</span><br></pre></td></tr></table></figure><p>该命令将会把对应库及其依赖库的文件都下载到当其目录的path文件夹当中</p><p>然后将path文件夹上传到离线环境的主机下</p><h3 id="第二步-在离线环境下安装path文件夹中的库"><a href="#第二步-在离线环境下安装path文件夹中的库" class="headerlink" title="第二步 在离线环境下安装path文件夹中的库"></a>第二步 在离线环境下安装path文件夹中的库</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install --no-index --find-links=./path transformers</span><br></pre></td></tr></table></figure><p>在离线环境下使用上述命令即可安装所需要的库</p><h3 id="补充1-提示缺少某个库依赖"><a href="#补充1-提示缺少某个库依赖" class="headerlink" title="补充1 提示缺少某个库依赖"></a>补充1 提示缺少某个库依赖</h3><p>这种情况是因为有网的主机python环境下已经存在某个所需要的包,所以并没有将这个包下载到path文件中,而离线环境下没有这个包所导致的,这种情况 只需要对于这个没有的包 使用一下上面的流程就可以了</p><h3 id="补充2-提示库的版本不对"><a href="#补充2-提示库的版本不对" class="headerlink" title="补充2 提示库的版本不对"></a>补充2 提示库的版本不对</h3><p>这种情况是因为有网主机的python环境(操作系统, python版本)与离线主机的python环境不一致导致的, 需要找一个与离线主机python版本一致的主机即可.</p><h2 id="离线安装conda库"><a href="#离线安装conda库" class="headerlink" title="离线安装conda库"></a>离线安装conda库</h2><p>你需要有什么？</p><ol><li>迁出机器：可联网，已有虚拟环境准备迁移的机器，可以是本地电脑也可以是服务器</li><li>迁入机器：不可联网，无虚拟环境，可以是另一台电脑也可以是服务器</li></ol><h3 id="迁出机器部分——打包环境"><a href="#迁出机器部分——打包环境" class="headerlink" title="迁出机器部分——打包环境"></a>迁出机器部分——打包环境</h3><p>迁出机器安装打包工具</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda install -c conda-forge conda-pack</span><br></pre></td></tr></table></figure><p>安装好之后打包需要迁出的环境（-n 之后为 虚拟环境名字 -o 之后为打包出来的文件名）</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda pack -n envsname -o conda_envsname.tar.gz</span><br></pre></td></tr></table></figure><p>gz是一个压缩文件，包含了你环境本身以及所有的包</p><p>将打包的环境通过 ftp 传输到迁入机器中</p><p>迁出机器部分结束</p><h3 id="迁入机器部分——解压、部署环境"><a href="#迁入机器部分——解压、部署环境" class="headerlink" title="迁入机器部分——解压、部署环境"></a>迁入机器部分——解压、部署环境</h3><p>在你的 anaconda 目录下创建文件夹 名称（envs）即为你迁过来的环境名称</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mkdir -p /root/anaconda3/envs/envsname</span><br></pre></td></tr></table></figure><p>解压环境（-C 之前为打包压缩文件路径 -C 之后为迁入机器 anaconda3 文件夹下 envs 目录 + 环境名）</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tar -xzf /root/tempfile/conda_envsname.tar.gz -C /root/anaconda3/envs/envsname</span><br></pre></td></tr></table></figure><p>执行后完成 cd 进 envs 目录中已经可以看到环境拷贝完成</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/root/anaconda3/envs/envsname</span><br></pre></td></tr></table></figure><p>检查环境是否完全复制</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">conda activate envsname</span><br><span class="line">pip list</span><br><span class="line">conda list</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://boywuxu.github.io/2024/02/28/%E5%AF%92%E6%AD%A6%E7%BA%AA%E5%B9%B3%E5%8F%B0%E4%BD%BF%E7%94%A8/</id>
    <link href="https://boywuxu.github.io/2024/02/28/%E5%AF%92%E6%AD%A6%E7%BA%AA%E5%B9%B3%E5%8F%B0%E4%BD%BF%E7%94%A8/"/>
    <published>2024-02-27T16:00:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="寒武纪平台使用-先进研究院-李治澎"><a href="#寒武纪平台使用-先进研究院-李治澎" class="headerlink" title="寒武纪平台使用(先进研究院-李治澎)"></a>寒武纪平台使用(先进研究院-李治澎)</h1><h2 id="使用自带的镜像创建新环境"><a href="#使用自带的镜像创建新环境" class="headerlink" title="使用自带的镜像创建新环境"></a>使用自带的镜像创建新环境</h2><p>目前有的镜像包括pytorch和tensorflow</p>
<img src="/images/image-20240227103324985.png" alt="image-20240227103324985" style="zoom: 67%;">

<p>业务管理-&gt;开发环境-&gt;创建</p>
<img src="/images/image-20240227103524410.png" alt="image-20240227103524410" style="zoom: 50%;">

<p>创建完之后等待平台拉取镜像后，会出现一个正在运行的环境</p>
<p><img src="/images/image-20240227103823922.png" alt="image-20240227103823922"></p>
<p>点击查看能够看到新创建的环境的ssh连接，如下</p>
<img src="/images/image-20240227104043958.png" alt="image-20240227104043958" style="zoom:67%;">]]>
    </summary>
    <title>寒武纪平台使用</title>
    <updated>2026-04-01T15:20:19.510Z</updated>
  </entry>
  <entry>
    <author>
      <name>无序</name>
    </author>
    <content>
      <![CDATA[<p>主要学习如何对大模型进行预训练工作，如果我们要使用一个已经经过一部分预训练的模型的话，实际上我们就可以得到这个预训练模型的预训练代码</p><h2 id="1-什么是大模型"><a href="#1-什么是大模型" class="headerlink" title="1. 什么是大模型"></a>1. 什么是大模型</h2><p>参数量很大（十几亿，几百亿）的深度神经网络模型</p><h3 id="1-1-基座模型选择"><a href="#1-1-基座模型选择" class="headerlink" title="1.1 基座模型选择"></a>1.1 基座模型选择</h3><p>开源领域 ChatGLM，LLAMA，RWKV 主要就是这 3 种模型， 中文好一点就是 ChatGLM，潜力最好的就是 LLAMA，RNN 架构决定 RWKV 有很好的推理效率（随输入长度内存占比线性自增，而 LLAMA 则是指数增加） 和 Length Extrapolation （关于长度外推性，可以参考苏神的文章 <a href="https://kexue.fm/archives/9431">[4]</a>）</p><h3 id="1-2-模型参数大小选择"><a href="#1-2-模型参数大小选择" class="headerlink" title="1.2 模型参数大小选择"></a>1.2 模型参数大小选择</h3><p>当然对于模型参数的选择，往往是参数越大效果越好。如果资源充足，当然是推荐 30B 以上的模型。不管是 6B, 7B 和 13B 同样的训练数据，同样训练参数，模型参数量大效果则优于低参数的模型。那么根据模型参数，如何预估我们的训练所需的内存开销，这里有一个简单的方法 比如 6B 模型，60 亿规模参数，根据以下公式计算： </p><p>模型参数 + 梯度参数 + 优化器参数 &#x3D; 6B * 1bytes + 6GB + 2*6GB &#x3D; 24GB </p><h3 id="1-3-数据处理"><a href="#1-3-数据处理" class="headerlink" title="1.3 数据处理"></a>1.3 数据处理</h3><p>对于 LLM 训练，数据质量很重要。预训练时，我们可以将数据先进行预处理，比如对数据进行一定规则的筛选，数据去重，去除一些低质量的数据。同时，我们可能面临各种类型的数据，PDF，Word，HTML，代码文件等等，对于这种不同类型的数据我们需要都处理成文本，同时还过滤掉一些干扰项或乱码的数据。</p><p>当然，我们也可以利用一些工具去处理，比如 justext <a href="https://github.com/miso-belica/jusText">[7]</a>，trafilatura <a href="https://github.com/adbar/trafilatura">[8]</a>，来提取文档主要内容，减少数据的噪音。对于空的文档或文档长度低于 100 进行过滤，进一步减少噪音。</p><p>对于一些机器生成的文本或 OCR 识别错误的文本，质量不高，由没有什么逻辑性，虽然比较难以检测，但是还是会有一些工具能做这样的事情，比如 ctrl-detector <a href="https://github.com/salesforce/ctrl-detector">[9]</a>。当然对于一些有毒的或带有偏见的数据，可以采用 PerspectiveAPI <a href="https://perspectiveapi.com/">[10]</a> 或垃圾邮件检测的办法来过滤。</p><p>我们还不得不考虑数据的一些隐私风险，也需要考虑，比如身份证号，银行卡等信息，比如 presidio 和 pii-codex 等工具提供了检测、分析和处理文本数据中的个人身份信息的能力。</p><p>指令微调数据，我们可以使用 PromptSource <a href="https://github.com/bigscience-workshop/promptsource">[11]</a> 来创建微调数据。当然我们还可以让 GPT4 给我们标注一些数据，这样蒸馏知识，可以让数据质量进一步提升。这里我分享一个我使用的 Prompt 工程：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">first_prompt = &quot;&quot;&quot;</span><br><span class="line">作为一位专业的xxxx，您的任务是从给定的上下文回答问题。</span><br><span class="line">给定的上下文：</span><br><span class="line">&quot;&quot;&quot;</span><br><span class="line">last_prompt = &quot;&quot;&quot;</span><br><span class="line">请综合上述信息，你给出的回复需要包含以下三个字段：</span><br><span class="line">1.questions: 基于上下文内容，提出与这个内容相关的问题，至少两个以上。</span><br><span class="line">2.answers: 然后根据问题，分别给出每个问题的答案，请用 markdown 格式。</span><br><span class="line">3.instruction: 给出上下文内容的总结，尽量精简，用 markdown 格式。</span><br><span class="line">请按照以下JSON格式来回答：</span><br><span class="line">前括号</span><br><span class="line">      &quot;questions&quot;: [</span><br><span class="line">          &quot;&lt;内容相关问题1&gt;&quot;,</span><br><span class="line">          &quot;&lt;内容相关问题2&gt;&quot;</span><br><span class="line">      ],</span><br><span class="line">      &quot;answers&quot;: [</span><br><span class="line">           &quot;&lt;内容相关问题1的答案&gt;&quot;,</span><br><span class="line">           &quot;&lt;内容相关问题2的答案&gt;&quot;</span><br><span class="line">      ],</span><br><span class="line">      instruction: &quot;&lt;总结性的内容&gt;&quot;</span><br><span class="line">后括号</span><br><span class="line">注意：如果碰到上下文内容信息不够，无法回答问题的情况，answers和questions可以返回空。</span><br><span class="line">最后强调一下：你的回复将直接用于javascript的JSON.parse解析，所以注意一定要以标准的JSON格式做回答，不要包含任何其他非JSON内容，否则你将被扣分！！！</span><br><span class="line">&quot;&quot;&quot;</span><br></pre></td></tr></table></figure><h3 id="1-4-大模型内在原理"><a href="#1-4-大模型内在原理" class="headerlink" title="1.4 大模型内在原理"></a>1.4 大模型内在原理</h3><h4 id="大模型不存在涌现能力"><a href="#大模型不存在涌现能力" class="headerlink" title="大模型不存在涌现能力"></a><a href="https://twitter.com/i/web/status/1654386086746132481">大模型不存在涌现能力</a></h4><p>目前人们所看到的涌现能力实质上是人们构建的指标是非线性指标所造成的,指标的非线性指的是指标只能代表0或1,所以模型在指标上表现出了从0到1的涌现性,而如果将指标换为线性指标,这篇论文发现模型的能力随着算力和模型参数规模在线性增加,也就是说,模型只是在做减小loss的行为,而没有发生涌现行为,是一种涌现错觉</p><blockquote><p>emergent abilities may be creations of the researcher’s choices, not a fundamental property of the model family on the specific task（“涌现”能力的出现是人为刻意标准下的筛选，而不是模型自己的真实能力）</p></blockquote><p>从这个看法来讲,我们应该重新正视大模型的发展,不是期望大模型能够利用其”涌现”造就神话故事,而是一步一步的推动模型的增长h</p><h2 id="2-预训练是什么意思"><a href="#2-预训练是什么意思" class="headerlink" title="2. 预训练是什么意思"></a>2. 预训练是什么意思</h2><p>预训练这个词并不是一个很新的词，之前就有，我理解的预训练就是大模型在某一个任务上进行模型训练，训练完成的模型参数就是预训练模型，预训练模型就意味着把人类的语言知识，先学了一个东西，然后再代入到某个具体任务，就顺手了，就是这么一个简单的道理。</p><p>预训练思想的本质：</p><ol><li>模型参数不再是随机初始化，而是通过一些任务（如语言模型）进行预训练</li><li>将训练任务拆解成共性学习和特性学习两个步骤</li></ol><h2 id="3-预训练有哪些技术"><a href="#3-预训练有哪些技术" class="headerlink" title="3. 预训练有哪些技术"></a>3. 预训练有哪些技术</h2><p>那么预训练应该具体怎么做？</p><p>大致流程：自监督的大规模预训练 + 微调，本文重点关注自监督预训练如何实现</p><p>预训练本质上是迁移学习的一种应用，利用几乎无限的文本，学习输入句子的每一个成员的上下文相关的表示，它隐式地学习到了通用的语法语义知识，预训练通过自监督学习从大规模数据中获得与具体任务无关的预训练模型。体现某一个词在一个特定上下文中的语义表征。</p><h3 id="3-1-网络"><a href="#3-1-网络" class="headerlink" title="3.1 网络"></a>3.1 网络</h3><p>transformer模型，是预训练的核心网络，因为有个非常好的优点，就是可以跑得很快，并且做的很深。</p><h3 id="3-2-预训练任务"><a href="#3-2-预训练任务" class="headerlink" title="3.2 预训练任务"></a>3.2 预训练任务</h3><p><img src="/images/2023-06-07_19-48.png"></p><p>预训练任务的分类架构通常可以分为两类，一类是基于自监督学习的预训练 任务，另一类是基于监督学习的预训练任务。具体而言，可以将预训练任务分成以下几类：</p><ol><li><p>基于自监督学习的预训练任务：这种预训练任务要求模型通过自监督方式来学习数据中的模式和结构，而不需要人工标注的标签。这种方法通常包括自回归预测和掩码语言模型等任务，模型通过对输入文本的预测来学习文本的语言结构和语义信息。</p><ol><li><p>自回归预测</p><ul><li>给出前几个单词，预测后一个单词的概率</li><li>从左向右做预测，再从右往左做预测</li></ul></li><li><p>掩码语言模型</p><ul><li><p>将句子中的一个词语掩盖掉，预测该词</p></li><li><p>动态mask（RoBERTa）</p></li><li><p>SpanBERT：Random Contiguous Words Masking and Span Boundary Objective (SBO) 随机掩盖一段连续的词、模型在预测掩盖词的同时，还需要预测出掩盖词所在的连续片段的开始位置和结束位置。</p></li><li><p>StructBERT ：Span Order Recovery task 模型在输入的文本中找到两个连续的实体，并预测它们在原始文本中的顺序</p></li><li><p>TLM：XLM 双语对齐 将源语言句子和目标语言句子拼接，模型需要预测这个拼接后的句子中缺失的一些词汇或者短语。</p></li><li><p>Seq2Seq MLM</p><blockquote><p>对于句子”The quick brown fox jumps over the lazy dog.”，Seq2Seq MLM任务可能会将其掩码为”The quick [MASK] fox jumps [MASK] the lazy dog.”，然后让模型预测掩码位置上的词汇。在预测第一个掩码位置时，模型可能会将其预测为”brown”，然后将”brown”作为下一个掩码位置的输入，继续预测下一个掩码位置上的词汇。</p></blockquote></li></ul></li><li><p>PLM：Permuted Language Modeling模型输入一个随机排列的词序列，并预测这些词在原始序列中的正确顺序。</p></li><li><p>对比学习Contrastive Learning，没有被替换的句子得分比被替换的句子得分高</p></li><li><p>DAE：Denoising Autoencoder：输入一句有噪音的句子，输入没有噪音的句子</p><blockquote><ol><li>随机mask</li><li>随机删除token</li><li>随机去除n个token</li><li>句子随机排序</li><li>文档旋转</li></ol></blockquote></li></ol></li><li><p>基于监督学习的预训练任务：这种预训练任务要求模型通过有标注的数据来学习任务特定的语言处理技能。这些任务通常包括情感分析、命名实体识别、文本分类等任务，模型通过对标注数据的学习来提高在特定任务上的表现。&#x3D;&#x3D;NLP领域，没有足够多的带标签的数据&#x3D;&#x3D;</p></li><li><p>基于弱监督学习的预训练任务：这种预训练任务要求模型通过仅有部分标注数据或者弱标注数据来学习任务特定的语言处理技能。这些任务通常包括半监督学习、多任务学习等方法，模型通过对标注数据和非标注数据的学习来提高在特定任务上的表现。</p></li></ol><h4 id="1-GPT3"><a href="#1-GPT3" class="headerlink" title="1. GPT3"></a>1. GPT3</h4><p>输入是单词序列，输出是对最有可能放在这个序列结尾的单词的预测。</p><p>输入采用固定长度为2048个token的序列。不足2048个token的短序列，用空值填充。GPT-3同时对输入序列的下一个token进行预测，但是通常只取输入序列中最后一个位置的预测token，并将其加入输入序列的末尾，进行下一个位置的预测。</p><h4 id="2-OPT"><a href="#2-OPT" class="headerlink" title="2. OPT"></a>2. OPT</h4><p>预训练任务与GPT3相同</p><h4 id="3-BLOOM"><a href="#3-BLOOM" class="headerlink" title="3. BLOOM"></a>3. BLOOM</h4><p>预训练任务与GPT3相同</p><h4 id="4-GLM-130B"><a href="#4-GLM-130B" class="headerlink" title="4. GLM-130B"></a>4. GLM-130B</h4><p>设计了两个预训练目标，包含自监督空白填充和多任务instruction预训练（Multi-Task Instruction Pre-Training，MIP）。</p><p>自监督空白填充（95% tokens）</p><p>为了同时支持理解和生成，设计了两种掩码方式。[MASK]：句子中的短空格，其长度被添加至输入的某一个部分； [gMASK]：句尾随机长度的长空格，并提供前缀上下文；具体来说，[MASK]训练目标占比30%。[gMASK]训练目标占比70%。</p><p>MIP（5% tokens）</p><p>收集了一个由自然语言理解、生成和信息抽取等组成的instruction prompted数据集，并在上面对模型进行预训练而不是微调，以防止破坏模型的生成能力。这个任务的目的是改善模型zero-shot任务的迁移能力。</p><h4 id="5-PaLM"><a href="#5-PaLM" class="headerlink" title="5. PaLM"></a>5. PaLM</h4><ul><li>编码器首先被训练成双向自动编码器，从损坏的上下文重建原始文本，随机token被采样，并根据BERT的实践用[MASK]符号替换。该训练优化了编码器输出与原始上下文之间的交叉重构损失，如BERT中的掩码语言建模(MLM)。通过预测上下文中被屏蔽的实际令牌，PALM迫使编码器理解未掩码token和整个上下文的含义。</li><li>然后将编码器和解码器联合训练，以从编码器的上下文表示形式自回归地生成文本输出。训练最大限度地提高了文本的loglikelihood in ground truth从解码器的输出:</li></ul><h4 id="6-Chinese-LLaMA"><a href="#6-Chinese-LLaMA" class="headerlink" title="6. Chinese LLaMA"></a>6. Chinese LLaMA</h4><p>自回归，给定序列，预测下一个token</p><p>以上是从头开始训练一个模型，如果要在一个已经预训练过的模型上再次进行训练，那就会面临<strong>灾难性遗忘</strong>的问题，以下是如何应对灾难性遗忘的方法，也被称为<strong>增量学习</strong>，与在线学习也有点关系：</p><ol><li>intelligent synapse（冻结权重）</li><li>replay</li><li>meta learning</li></ol><h3 id="3-2-预训练任务-另一种划分"><a href="#3-2-预训练任务-另一种划分" class="headerlink" title="3.2 预训练任务 另一种划分"></a>3.2 <a href="https://arxiv.org/pdf/2107.13586.pdf">预训练任务 另一种划分</a></h3><p>• <strong>Next Sentence Prediction (NSP)</strong> (Devlin et al., 2019): A binary classification loss predicting whether two<br>segments appear consecutively within a larger document, or are random unrelated sentences.<br>• <strong>Sentence Order Prediction (SOP)</strong> (Lan et al., 2020): A binary classification loss for predicting whether two<br>sentences are in a natural or swapped order.<br>• <strong>Capital Word Prediction (CWP)</strong> (Liu et al., 2020b): A binary classification objective calculated over each<br>word, predicting whether whether each word is capitalized or not.<br>• <strong>Sentence Deshuffling (SDS)</strong> (Liu et al., 2020b): A multi-class classification task to reorganize permuted<br>segments.<br>• <strong>Sentence distance prediction (SDP)</strong> (Liu et al., 2020b) : A three-class classification task, predicting the<br>positional relationship between two sentences (adjacent in the same document, not adjacent but in the same document, in different documents).<br>• <strong>Masked Column Prediction (MCP)</strong> (Yin et al., 2020): Given a table, recover the names and data types of<br>masked columns.<br>• <strong>Linguistic-Visual Alignment (LVA)</strong> (Lu et al., 2019): A binary classification to Predict whether the text content can be aligned to visual content.<br>• <strong>Image Region prediction (IRP)</strong> (Su et al., 2020): Given an image whose partial features are masked (zeroed out), predict the masked regions.<br>• <strong>Replaced Token Detection (RTD)</strong> (Xiao et al., 2021): A binary classification loss predicting whether each token in corrupted input was replaced by a generative sample or not.<br>• <strong>Discourse Relation Prediction (DRP)</strong> (Sun et al., 2020): Predict the semantic or rhetorical relation between two sentences.<br>• <strong>Translation Language Modeling (TLM)</strong> (Lample and Conneau, 2019): Consider parallel sentences and mask words randomly in both source and target sentences.<br>• <strong>Information Retrieval Relevance (IRR)</strong> (Sun et al., 2020): Predict the information retrieval relevance of two sentences.<br>• <strong>Token-Passage Prediction (TPP)</strong> (Liu et al., 2020b): Identify the keywords of a passage appearing in the<br>segment.<br>• <strong>Universal Knowledge-Text Prediction (UKTP)</strong> (Sun et al., 2021): Incorporate knowledge into one pre-trained language model.<br>• <strong>Machine Translation (MT)</strong> (Chi et al., 2021a) : Translate a sentence from the source language into the target language.<br>• <strong>Translation Pair Span Corruption (TPSC)</strong> (Chi et al., 2021a) : Predict the masked spans from a translatio pair.<br>• <strong>Translation Span Corruption (TSC)</strong> (Chi et al., 2021a) : Unlike TPSC, TSC only masks and predicts the spans in one language</p><p>• <strong>Multilingual Replaced Token Detection (MRTD)</strong> (Chi et al., 2021b): Distinguish real input tokens from corrupted multilingual sentences by a Generative Adversarial Network, where both the generator and the<br>discriminator are shared across languages.<br>• <strong>Translation Replaced Token Detection (TRTD)</strong> (Chi et al., 2021b): Distinguish the real tokens and masked tokens in the translation pair by the Generative Adversarial Network.<br>• <strong>Knowledge Embedding (KE)</strong> (Wang et al., 2021): Encode entities and relations in knowledge graphs (KGs) as distributed representations<br>• <strong>Image-to-text transfer (ITT)</strong> (Wang et al., 2021): Is similar to the image caption that generates a corresponding description for the input image.<br>• <strong>Multimodality-to-text transfer (MTT)</strong> (Wang et al., 2021): Generate the target text based on both the visual information and the noised linguistic information.</p><h3 id="3-3-预训练数据"><a href="#3-3-预训练数据" class="headerlink" title="3.3 预训练数据"></a>3.3 预训练数据</h3><ol><li>训练数据中使用代码数据可以很好地提升LLM的推理逻辑能力</li></ol><h3 id="3-4-如何避免灾难性遗忘"><a href="#3-4-如何避免灾难性遗忘" class="headerlink" title="3.4 如何避免灾难性遗忘"></a>3.4 如何避免灾难性遗忘</h3><p>通常我们有以下方式，可以减少或避免灾难性遗忘问题</p><ul><li>将重要的权重冻结 - 像 Lora 就是采用的这种方案，只学习部分网络权重。但这里 Lora 的配置其实是要注意一下，如果你是用 Lora 做预训练，lora 训练模块可以配上 q_proj,v_proj,k_proj,o_proj 如果是微调则只需要训练 q_proj,v_proj lora_rank 的设置也有讲究，初始设 lora_ran 为 8，训练存在遗忘时，可以将 lora_rank 改为 64（原因是与原模型数据领域相差较大的话，需要更大的秩，原论文有说明）。</li><li>复习 - 跟人一样，在预训练或微调时，回看之前训练的数据。还可以专门把特征图存起来，量化以后放在一个类似于记忆库的地方，之后在新任务上训练的时候从这个记忆库里重构出记忆和新数据一起训练。感兴趣可以看这篇论文 <a href="https://arxiv.org/abs/1910.02509">[16]</a>。 </li><li>MoE - 稀疏门控制的专家混合层，最近爆出 GPT4 是由 8 个 220B 的模型组合。关于 Moe 相关资料 <a href="https://zhuanlan.zhihu.com/p/542465517">[17]</a> 大家自行了解。</li></ul><h3 id="3-4-大模型预训练与知识图谱结合"><a href="#3-4-大模型预训练与知识图谱结合" class="headerlink" title="3.4 大模型预训练与知识图谱结合"></a>3.4 大模型预训练与知识图谱结合</h3><p><img src="/images/2023-07-13_08-53.jpg"></p><h4 id="3-4-1-KGs-增强-LLM"><a href="#3-4-1-KGs-增强-LLM" class="headerlink" title="3.4.1 KGs 增强 LLM"></a>3.4.1 KGs 增强 LLM</h4><h5 id="1-KG增强的LLM预训练"><a href="#1-KG增强的LLM预训练" class="headerlink" title="1. KG增强的LLM预训练"></a>1. KG增强的LLM预训练</h5><ol><li><p>将KGs整合到训练目标中</p><p>利用KGs中蕴含的实体信息作为监督信号，让LLM来通过某种方式预测得到KGs中的实体信息</p></li><li><p>将KGs整合到LLM输入中</p><p>将KGs中的知识形成文本作为大模型的输入</p></li><li><p>通过额外的融合模块整合KGs</p><img src="/images/image-20230713105751597.png" alt="image-20230713105751597" style="zoom:67%;" /></li></ol><h5 id="2-KG增强LLM推理"><a href="#2-KG增强LLM推理" class="headerlink" title="2. KG增强LLM推理"></a>2. KG增强LLM推理</h5><ol><li><p>动态知识融合</p><p>将知识图谱编码，与输入编码融合，使用问答数据微调</p></li><li><p>&#x3D;&#x3D;检索增强的知识融合&#x3D;&#x3D;</p><p>对于问题，先在KG上查找相关信息作为变量z, 然后将z作为附加上下文信息和问题一起输入到LLM中</p></li></ol><h5 id="3-KG增强的LLM可解释性"><a href="#3-KG增强的LLM可解释性" class="headerlink" title="3. KG增强的LLM可解释性"></a>3. KG增强的LLM可解释性</h5><ol><li><p>用于LLMs探测的KGs</p><p>使用LLM来回答KG中的知识问题</p></li><li><p>用于LLMs分析的KGs</p><p>采用语言模型来生成知识图</p></li></ol><h4 id="3-4-2-LLM增强-KGs"><a href="#3-4-2-LLM增强-KGs" class="headerlink" title="3.4.2 LLM增强 KGs"></a>3.4.2 LLM增强 KGs</h4><h4 id="3-4-3-LLM-与-KGs-协同"><a href="#3-4-3-LLM-与-KGs-协同" class="headerlink" title="3.4.3 LLM 与 KGs 协同"></a>3.4.3 LLM 与 KGs 协同</h4><ol><li><p>知识表示</p><img src="/images/image-20230713151118243.png" alt="image-20230713151118243" style="zoom:50%;" /></li><li><p>推理</p><p>在问答任务中，QA-GNN[117]首先利用LLM来处理文本问题，并指导推理步骤。通过这种方式，它可以弥合文本和结构信息之间的差距，从而为推理过程提供可解释性。在知识图谱推理任务中，LARK[45]提出了一种LLM引导的逻辑推理方法。它首先将传统的逻辑规则转换为语言序列，然后要求LLM对最终输出进行推理。此外，siyuan等人[46]将结构推理和语言模式预训练统一在一个统一的框架中。给定文本输入，他们采用LLM来生成逻辑查询，该查询在KGs上执行以获得结构上下文。最后，将结构上下文与文本信息融合以生成最终输出。RecInDial[243]结合知识图谱和LLM，在对话系统中提供个性化推荐。KnowledgeDA[244]提出了一个统一的领域语言模型开发pipeline，以增强具有领域知识图谱的任务特定训练过程。</p></li></ol><h2 id="4-监督式微调"><a href="#4-监督式微调" class="headerlink" title="4  监督式微调"></a>4  监督式微调</h2><h3 id="1-ChatGLM-p-tuning-v2"><a href="#1-ChatGLM-p-tuning-v2" class="headerlink" title="1. ChatGLM: p-tuning v2"></a>1. ChatGLM: p-tuning v2</h3><p>soft prompt tuning</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">- prompt_learning:带女朋友去了一家餐厅，她吃的很开心，这家餐厅太__了！</span><br><span class="line">- Instruction_tuning:判断这句话的情感：带女朋友去了一家餐厅，她吃的很开心。选项：A=好，B=一般，C=差</span><br></pre></td></tr></table></figure><h3 id="2-hybrid-tuning"><a href="#2-hybrid-tuning" class="headerlink" title="2. hybrid-tuning"></a>2. hybrid-tuning</h3><p>deal with the catastrophic forgetting</p><img src="/images/2023-06-15_08-59.png" style="zoom: 50%;" /><h3 id="3-MOSS-fine-tuning-in-instruction-data"><a href="#3-MOSS-fine-tuning-in-instruction-data" class="headerlink" title="3. MOSS: fine-tuning in instruction data"></a>3. MOSS: fine-tuning in instruction data</h3><h3 id="4-Chinese-LLaMA-Alpaca-pre-trained-1-pre-trained-2-instruction-tuning"><a href="#4-Chinese-LLaMA-Alpaca-pre-trained-1-pre-trained-2-instruction-tuning" class="headerlink" title="4. Chinese-LLaMA-Alpaca: pre-trained 1 + pre-trained 2 + instruction_tuning"></a>4. Chinese-LLaMA-Alpaca: pre-trained 1 + pre-trained 2 + instruction_tuning</h3><h3 id="5-QLoRA"><a href="#5-QLoRA" class="headerlink" title="5. QLoRA"></a>5. QLoRA</h3><p>QLoRA通过冻结的、4比特量化的预训练语言模型来做 LoRA，进行反向传播梯度。</p><p><a href="https://arxiv.org/pdf/2305.14314.pdf">https://arxiv.org/pdf/2305.14314.pdf</a></p><p><a href="https://zhuanlan.zhihu.com/p/632229856">https://zhuanlan.zhihu.com/p/632229856</a></p><p><strong>如果你受限于GPU内存，QLoRA可能是值得考虑的选择。它可以节省33%的内存，但运行时间将增加39%</strong></p><h3 id="6-LORA"><a href="#6-LORA" class="headerlink" title="6. LORA"></a>6. LORA</h3><img src="/images/image-20231004153011481.png" alt="image-20231004153011481" style="zoom:50%;" /><p>LORA实战小技巧:</p><ol><li><strong>调整LoRA的秩（rank）并选择合适的alpha值至关重要。将alpha值设定为rank值的两倍是一个明智的选择</strong></li><li><strong>如果你正在使用LoRA，应将其应用于所有层（而不是仅仅应用于Key和Value矩阵），以最大化模型性能</strong></li><li><strong>我们可以在14GB RAM的单个GPU上，在几小时内有效微调70亿参数的模型。使用静态数据集优化一个LLM，让其完美胜任所有基准任务难以实现。要解决这个问题，需要使用多样化的数据源，或许LoRA并不是理想的工具</strong></li><li><strong>对指令微调进行多轮训练作用不大，可能会导致结果恶化。我在1000个示例的LIMA数据集上也观察到了同样的情况。这种性能下降可能是由过拟合导致的，这需要进一步的研究</strong></li><li><strong>LoRA让我们能够在单个GPU上微调7B参数的LLM。在这种特殊情况下，使用最佳设置（r&#x3D;256、alpha&#x3D;512）的QLoRA，在A100上，使用AdamW进行50000个训练示例（Alpaca数据集）的训练，占用了17.86 GB的内存，大约需要3小时。</strong></li></ol><h3 id="7-Adapter-Tuning"><a href="#7-Adapter-Tuning" class="headerlink" title="7. Adapter Tuning"></a>7. Adapter Tuning</h3><h3 id="8-Prefix-Tuning"><a href="#8-Prefix-Tuning" class="headerlink" title="8. Prefix  Tuning"></a>8. Prefix  Tuning</h3><h3 id="9-AdaLoRA"><a href="#9-AdaLoRA" class="headerlink" title="9. AdaLoRA"></a>9. AdaLoRA</h3><h2 id="5-对齐"><a href="#5-对齐" class="headerlink" title="5.对齐"></a>5.对齐</h2><h3 id="1-RLHF"><a href="#1-RLHF" class="headerlink" title="1. RLHF"></a>1. RLHF</h3><h2 id="6-模型使用"><a href="#6-模型使用" class="headerlink" title="6. 模型使用"></a>6. 模型使用</h2><h3 id="1-上下文提示"><a href="#1-上下文提示" class="headerlink" title="1. 上下文提示"></a>1. 上下文提示</h3><h3 id="2-思维链提示"><a href="#2-思维链提示" class="headerlink" title="2. 思维链提示"></a>2. 思维链提示</h3><p>鼓励大语言模型解释其推理过程。思维链的主要思想是通过向大语言模型展示一些少量的 exapmles，在样例中解释推理过程，大语言模型在回答提示时也会显示推理过程。这种推理的解释往往会引导出更准确的结果。</p><p><strong>CoT prompting：</strong>输出由原来的answer 变为 reason + answer</p><p><strong>Zero-shot-CoT：</strong>是一个 pipeline。使用“Let’s think step by step”让LLM 生成一些思考过程 a，然后将生成的 a（理由） 和 question 拼在一起，再加一个answer 指向的 prompt 如“The answer is ”来激励模型生成答案。</p><p><strong><a href="https://arxiv.org/abs/2203.11171">自洽性（Self-consistency）</a>：</strong>生成多个思路链，然后取多数答案作为最终答案</p><p><a href="https://arxiv.org/abs/2205.10625"><strong>Least to Most prompting, LtM</strong></a>：首先将问题分解为子问题，然后逐个解决。</p><p><a href="https://arxiv.org/abs/2307.05300">Multi-Persona Self-Collaboration</a>：这个有点类似之前提到的 AutoGen，让多个代理相互对话来解决问题，只不过 AutoGen 是从工程层面真正做到了多 Agents 交互，而这里提到的，是让 ChatGPT 扮演多重人格&#x2F;角色，例如：</p><p>“你可以扮演任何角色，针对我给出的问题，请提供三个最相关的角色，对问题进行两轮讨论，然后你综合讨论结果总结最佳方案。请打印三个角色的讨论过程以及最后的方案。</p><p><strong>思维树：</strong></p><blockquote><p>举例：假设三位不同的专家来回答这个问题。所有专家都写下他们思考这个问题的第一个步骤，然后与大家分享。然后，所有专家都写下他们思考的下一个骤并分享。以此类推，直到所有专家写完他们思考的所有步骤。只要大家发现有专家的步骤出错了，就让这位专家离开。请问…</p></blockquote><h3 id="3-推理加速"><a href="#3-推理加速" class="headerlink" title="3. 推理加速"></a>3. <strong>推理加速</strong></h3><p>对于推理，一般我们采用量化方案，这里有两个办法。第一个则是采用 ggml 工具，比如 llama.cpp <a href="https://github.com/ggerganov/llama.cpp">[18]</a> 针对 llama 模型，将模型量化运行在 cpu 或 gpu 上，也可以 cpu 和 gpu 一起跑，内存则大大减少，推理速度有极大的提高。 </p><p>这里如果将 llama.cpp 运行在 gpu 上， 编译时一定要加 LLAMA_CUBLAS&#x3D;1，同时推理的时候，指定 –gpu-layers|-ngl 来分配运行在 gpu 上的层数，当然越大，占用 gpu 的内存会越多。</p><p>如果是 RWKV 模型，则考虑采用 rwkv.cpp <a href="https://github.com/saharNooby/rwkv.cpp">[19]</a>，此方法与 llama.cpp 类似，使用方式也是类似的。</p><p>还有 Llama 模型还可以考虑使用 exllama <a href="https://github.com/turboderp/exllama">[20]</a> 纯 GPU 的加速，虽然还不够完善，但也可以值得一试。</p><p>另一个，采用 LLM Accelerator <a href="https://arxiv.org/pdf/2304.04487.pdf">[21]</a>，LLM 存在大量的相似性推理，基于此，可以做一些优化加速推理，具体请看论文。最后采用架构上的调整，faster transformer <a href="https://github.com/NVIDIA/FasterTransformer">[22]</a> 要优于传统的 transformer 架构。</p><h2 id="7-实践环节"><a href="#7-实践环节" class="headerlink" title="7. 实践环节"></a>7. 实践环节</h2><p>总结一下，目前的大模型范式基本上都是预训练+微调</p><p>预训练分为两种情况：</p><ol><li><p>从头开始预训练</p><p>那就是要构造训练任务，主要用自回归任务和自编码任务两种主流训练方法</p></li><li><p>对已经预训练过的模型进行再次预训练</p><p>这种情况可以当作增量学习的问题来看</p></li></ol><p><a href="https://github.com/ymcui/Chinese-LLaMA-Alpaca-2">LLaMA chinese  微调 跑通</a></p><blockquote><ol><li><p>尝试langchain</p></li><li><p>构造微调数据（目前质量堪忧）使用通用指令数据混合wiki数据</p></li><li><p>微调llama（1. 微调预训练过的模型 2.微调原模型）</p><blockquote><p><strong>问题：微调和与预训练之后都丧失了模型的对话能力？？？ 本质上是过拟合</strong></p></blockquote></li></ol></blockquote><h2 id="基础优化手段"><a href="#基础优化手段" class="headerlink" title="基础优化手段"></a>基础优化手段</h2><p>- Zero-shot：<a href="https://arxiv.org/abs/2109.01652">arxiv.org</a><br>- Few-shot：<a href="https://arxiv.org/abs/2005.14165">arxiv.org</a><br>- CoT：<a href="https://arxiv.org/abs/2201.11903">arxiv.org</a><br>- ToT：<a href="https://arxiv.org/abs/2305.10601">arxiv.org</a><br>- GoT：<a href="https://arxiv.org/abs/2308.09687">arxiv.org</a><br>- SC：<a href="https://arxiv.org/abs/2203.11171">arxiv.org</a><br>- Multi Persona：<a href="https://arxiv.org/abs/2307.05300">arxiv.org</a><br>- Least to Most：<a href="https://arxiv.org/abs/2205.10625">arxiv.org</a><br>- Step Back：<a href="https://arxiv.org/abs/2310.06117">arxiv.org</a><br>- ART：<a href="https://arxiv.org/abs/2303.09014">arxiv.org</a><br>- ReAct：<a href="https://arxiv.org/abs/2210.03629">arxiv.org</a><br>- Reflection：<a href="https://arxiv.org/abs/2303.11366">arxiv.org</a><br>- RAG：<a href="https://arxiv.org/abs/2005.11401">arxiv.org</a></p><h2 id="8-检测是否是AI生成的方法"><a href="#8-检测是否是AI生成的方法" class="headerlink" title="8.检测是否是AI生成的方法"></a>8.检测是否是AI生成的方法</h2><p><a href="https://arxiv.org/pdf/2301.11305.pdf">一个zero-shot检测文本是否由AI生成的方法</a>：</p><ol><li>选定一段新的文本，用LLM计算这段文本的对数概率</li><li>对文本进行少量的词汇替换（例如mask几个词然后rewrite）</li><li>对重新生成的文本再次计算文本的对数概率</li><li>重复几次，将这些对数概率画成曲线</li></ol><p>如果这篇文本是由AI写的，那么所得曲线更像红色曲线，原始文本会处于平缓区域的最大值</p><p>如果这篇文本是真人写的，那么所得曲线更像绿色曲线，重写文本的对数概率可能高于&#x2F;低于原文本</p><img src="/images/image-20231028094229464.png" alt="image-20231028094229464" style="zoom: 33%;" /><h2 id="9-大模型测评"><a href="#9-大模型测评" class="headerlink" title="9. 大模型测评"></a>9. 大模型测评</h2><p><a href="https://github.com/GPT-Fathom/GPT-Fathom">GPT-Fathom</a></p><p>GPT-Fathom是一个开源和可复制的LLM评估套件，在对齐设置下对10多个领先的开源和闭源LLM以及OpenAI的早期模型进行基准测试。</p><h2 id="10-总结原则"><a href="#10-总结原则" class="headerlink" title="10. 总结原则"></a>10. 总结原则</h2><p>最后总结几条原则： </p><ul><li>参数多量化低的模型要优于参数低量化高的模型 </li><li>模型质量与训练数据质量是存在相关性的 </li><li>扩充中文词表有助于提高推理效率 </li><li>微调推荐采用 Lora QLora 方案 </li><li>模型加速必然需要对模型进行量化</li></ul>]]>
    </content>
    <id>https://boywuxu.github.io/2023/12/14/LLM/</id>
    <link href="https://boywuxu.github.io/2023/12/14/LLM/"/>
    <published>2023-12-13T16:00:00.000Z</published>
    <summary>
      <![CDATA[<p>主要学习如何对大模型进行预训练工作，如果我们要使用一个已经经过一部分预训练的模型的话，实际上我们就可以得到这个预训练模型的预训练代码</p>
<h2 id="1-什么是大模型"><a href="#1-什么是大模型" class="headerlink" title="1. 什么是大模型"></a>1. 什么是大模型</h2><p>参数量很大（十几亿，几百亿）的深度神经网络模型</p>
<h3 id="1-1-基座模型选择"><a href="#1-1-基座模型选择" class="headerlink" title="1.1 基座模型选择"></a>1.1 基座模型选择</h3><p>开源领域 ChatGLM，LLAMA，RWKV 主要就是这 3 种模型， 中文好一点就是 ChatGLM，潜力最好的就是 LLAMA，RNN 架构决定 RWKV 有很好的推理效率（随输入长度内存占比线性自增，而 LLAMA 则是指数增加） 和 Length Extrapolation （关于长度外推性，可以参考苏神的文章 <a href="https://kexue.fm/archives/9431">[4]</a>）</p>
<h3 id="1-2-模型参数大小选择"><a href="#1-2-模型参数大小选择" class="headerlink" title="1.2 模型参数大小选择"></a>1.2 模型参数大小选择</h3><p>当然对于模型参数的选择，往往是参数越大效果越好。如果资源充足，当然是推荐 30B 以上的模型。不管是 6B, 7B 和 13B 同样的训练数据，同样训练参数，模型参数量大效果则优于低参数的模型。那么根据模型参数，如何预估我们的训练所需的内存开销，这里有一个简单的方法 比如 6B 模型，60 亿规模参数，根据以下公式计算： </p>
<p>模型参数 + 梯度参数 + 优化器参数 &#x3D; 6B * 1bytes + 6GB + 2*6GB &#x3D; 24GB </p>
<h3 id="1-3-数据处理"><a href="#1-3-数据处理" class="headerlink" title="1.3 数据处理"></a>1.3 数据处理</h3><p>对于 LLM 训练，数据质量很重要。预训练时，我们可以将数据先进行预处理，比如对数据进行一定规则的筛选，数据去重，去除一些低质量的数据。同时，我们可能面临各种类型的数据，PDF，Word，HTML，代码文件等等，对于这种不同类型的数据我们需要都处理成文本，同时还过滤掉一些干扰项或乱码的数据。</p>]]>
    </summary>
    <title>大语言模型的预训练、微调等技术</title>
    <updated>2026-04-01T15:20:19.513Z</updated>
  </entry>
</feed>
