Files

5808 lines
184 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="zh" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="一本开源的直觉优先教科书,从零开始覆盖数学、计算机科学和人工智能(中文翻译版)。">
<meta name="author" content="Henry Ndubuaku (flykhan 译)">
<link rel="canonical" href="https://flykhan.github.io/maths-cs-ai-compendium-zh/chapter%2007%3A%20computational%20linguistics/05.%20advanced%20text%20generation/">
<link rel="prev" href="../04.%20transformers%20and%20language%20models/">
<link rel="next" href="../../chapter%2008%3A%20computer%20vision/01.%20image%20fundamentals/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
<title>高级文本生成 - 数学、计算机科学与 AI 百科全书</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="slate" data-md-color-accent="indigo">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#_1" class="md-skip">
跳转至
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="页眉">
<a href="../.." title="数学、计算机科学与 AI 百科全书" class="md-header__button md-logo" aria-label="数学、计算机科学与 AI 百科全书" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
数学、计算机科学与 AI 百科全书
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
高级文本生成
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="slate" data-md-color-accent="indigo" aria-label="切换到深色模式" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="切换到深色模式" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
</label>
<input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="slate" data-md-color-accent="indigo" aria-label="切换到浅色模式" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="切换到浅色模式" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="搜索" placeholder="搜索" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="查找">
<button type="reset" class="md-search__icon md-icon" title="清空当前内容" aria-label="清空当前内容" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
正在初始化搜索引擎
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/flykhan/maths-cs-ai-compendium-zh" title="前往仓库" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
flykhan/maths-cs-ai-compendium-zh
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="标签" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../.." class="md-tabs__link">
首页
</a>
</li>
<li class="md-tabs__item">
<a href="../../chapter%2001%3A%20vectors/01.%20vector%20spaces/" class="md-tabs__link">
向量
</a>
</li>
<li class="md-tabs__item">
<a href="../../chapter%2002%3A%20matrices/01.%20matrix%20properties/" class="md-tabs__link">
矩阵
</a>
</li>
<li class="md-tabs__item">
<a href="../../chapter%2003%3A%20calculus/01.%20differential%20calculus/" class="md-tabs__link">
微积分
</a>
</li>
<li class="md-tabs__item">
<a href="../../chapter%2004%3A%20statistics/01.%20fundamentals/" class="md-tabs__link">
统计学
</a>
</li>
<li class="md-tabs__item">
<a href="../../chapter%2005%3A%20probability/01.%20counting/" class="md-tabs__link">
概率论
</a>
</li>
<li class="md-tabs__item">
<a href="../../chapter%2006%3A%20machine%20learning/01.%20classical%20machine%20learning/" class="md-tabs__link">
机器学习
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../01.%20linguistic%20foundations/" class="md-tabs__link">
计算语言学
</a>
</li>
<li class="md-tabs__item">
<a href="../../chapter%2008%3A%20computer%20vision/01.%20image%20fundamentals/" class="md-tabs__link">
计算机视觉
</a>
</li>
<li class="md-tabs__item">
<a href="../../chapter%2009%3A%20audio%20and%20speech/01.%20digital%20signal%20processing/" class="md-tabs__link">
音频与语音
</a>
</li>
<li class="md-tabs__item">
<a href="../../chapter%2010%3A%20multimodal%20learning/01.%20multimodal%20representations/" class="md-tabs__link">
多模态学习
</a>
</li>
<li class="md-tabs__item">
<a href="../../chapter%2011%3A%20autonomous%20systems/01.%20perception/" class="md-tabs__link">
自主系统
</a>
</li>
<li class="md-tabs__item">
<a href="../../chapter%2012%3A%20graph%20neural%20networks/01.%20geometric%20deep%20learning/" class="md-tabs__link">
图神经网络
</a>
</li>
<li class="md-tabs__item">
<a href="../../chapter%2013%3A%20computing%20and%20OS/01.%20discrete%20maths/" class="md-tabs__link">
计算机与操作系统
</a>
</li>
<li class="md-tabs__item">
<a href="../../chapter%2014%3A%20data%20structures%20and%20algorithms/00.%20foundations/" class="md-tabs__link">
数据结构与算法
</a>
</li>
<li class="md-tabs__item">
<a href="../../chapter%2015%3A%20production%20software%20engineering/01.%20linux%20and%20CMD/" class="md-tabs__link">
生产级软件工程
</a>
</li>
<li class="md-tabs__item">
<a href="../../chapter%2016%3A%20SIMD%20and%20GPU%20programming/00.%20why%20C%2B%2B%20and%20how%20ML%20frameworks%20work/" class="md-tabs__link">
SIMD 与 GPU 编程
</a>
</li>
<li class="md-tabs__item">
<a href="../../chapter%2017%3A%20AI%20inference/01.%20quantisation/" class="md-tabs__link">
AI 推理
</a>
</li>
<li class="md-tabs__item">
<a href="../../chapter%2018%3A%20ML%20systems%20design/01.%20systems%20design%20fundamentals/" class="md-tabs__link">
ML 系统设计
</a>
</li>
<li class="md-tabs__item">
<a href="../../chapter%2019%3A%20applied%20AI/01.%20AI%20for%20finance/" class="md-tabs__link">
应用 AI
</a>
</li>
<li class="md-tabs__item">
<a href="../../chapter%2020%3A%20bleeding%20edge%20AI/01.%20quantum%20machine%20learning/" class="md-tabs__link">
前沿 AI
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="导航栏" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="数学、计算机科学与 AI 百科全书" class="md-nav__button md-logo" aria-label="数学、计算机科学与 AI 百科全书" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
数学、计算机科学与 AI 百科全书
</label>
<div class="md-nav__source">
<a href="https://github.com/flykhan/maths-cs-ai-compendium-zh" title="前往仓库" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
flykhan/maths-cs-ai-compendium-zh
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
<span class="md-ellipsis">
首页
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<span class="md-ellipsis">
向量
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
向量
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter%2001%3A%20vectors/01.%20vector%20spaces/" class="md-nav__link">
<span class="md-ellipsis">
向量空间
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2001%3A%20vectors/02.%20vector%20properties/" class="md-nav__link">
<span class="md-ellipsis">
向量性质
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2001%3A%20vectors/03.%20norms%20and%20metrics/" class="md-nav__link">
<span class="md-ellipsis">
范数与度量
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2001%3A%20vectors/04.%20products/" class="md-nav__link">
<span class="md-ellipsis">
向量积
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2001%3A%20vectors/05.%20basis%20and%20duality/" class="md-nav__link">
<span class="md-ellipsis">
基与对偶性
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<span class="md-ellipsis">
矩阵
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
矩阵
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter%2002%3A%20matrices/01.%20matrix%20properties/" class="md-nav__link">
<span class="md-ellipsis">
矩阵性质
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2002%3A%20matrices/02.%20matrix%20types/" class="md-nav__link">
<span class="md-ellipsis">
矩阵类型
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2002%3A%20matrices/03.%20operations/" class="md-nav__link">
<span class="md-ellipsis">
矩阵运算
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2002%3A%20matrices/04.%20linear%20transformations/" class="md-nav__link">
<span class="md-ellipsis">
线性变换
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2002%3A%20matrices/05.%20decompositions/" class="md-nav__link">
<span class="md-ellipsis">
矩阵分解
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<span class="md-ellipsis">
微积分
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
微积分
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter%2003%3A%20calculus/01.%20differential%20calculus/" class="md-nav__link">
<span class="md-ellipsis">
微分
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2003%3A%20calculus/02.%20integral%20calculus/" class="md-nav__link">
<span class="md-ellipsis">
积分
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2003%3A%20calculus/03.%20multivariate%20calculus/" class="md-nav__link">
<span class="md-ellipsis">
多元微积分
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2003%3A%20calculus/04.%20function%20approximation/" class="md-nav__link">
<span class="md-ellipsis">
函数逼近
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2003%3A%20calculus/05.%20optimisation/" class="md-nav__link">
<span class="md-ellipsis">
优化
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<span class="md-ellipsis">
统计学
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
统计学
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter%2004%3A%20statistics/01.%20fundamentals/" class="md-nav__link">
<span class="md-ellipsis">
基础
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2004%3A%20statistics/02.%20measures/" class="md-nav__link">
<span class="md-ellipsis">
统计量
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2004%3A%20statistics/03.%20sampling/" class="md-nav__link">
<span class="md-ellipsis">
抽样
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2004%3A%20statistics/04.%20hypothesis%20testing/" class="md-nav__link">
<span class="md-ellipsis">
假设检验
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2004%3A%20statistics/05.%20inference/" class="md-nav__link">
<span class="md-ellipsis">
推断
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<span class="md-ellipsis">
概率论
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
概率论
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter%2005%3A%20probability/01.%20counting/" class="md-nav__link">
<span class="md-ellipsis">
计数
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2005%3A%20probability/02.%20probability%20concepts/" class="md-nav__link">
<span class="md-ellipsis">
概率概念
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2005%3A%20probability/03.%20distributions/" class="md-nav__link">
<span class="md-ellipsis">
分布
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2005%3A%20probability/04.%20bayesian/" class="md-nav__link">
<span class="md-ellipsis">
贝叶斯
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2005%3A%20probability/05.%20information%20theory/" class="md-nav__link">
<span class="md-ellipsis">
信息论
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<span class="md-ellipsis">
机器学习
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
机器学习
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter%2006%3A%20machine%20learning/01.%20classical%20machine%20learning/" class="md-nav__link">
<span class="md-ellipsis">
经典机器学习
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2006%3A%20machine%20learning/02.%20gradient%20machine%20learning/" class="md-nav__link">
<span class="md-ellipsis">
梯度机器学习
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2006%3A%20machine%20learning/03.%20deep%20learning/" class="md-nav__link">
<span class="md-ellipsis">
深度学习
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2006%3A%20machine%20learning/04.%20reinforcement%20learning/" class="md-nav__link">
<span class="md-ellipsis">
强化学习
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2006%3A%20machine%20learning/05.%20distributed%20deep%20learning/" class="md-nav__link">
<span class="md-ellipsis">
分布式深度学习
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8" checked>
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="">
<span class="md-ellipsis">
计算语言学
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
计算语言学
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../01.%20linguistic%20foundations/" class="md-nav__link">
<span class="md-ellipsis">
语言学基础
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../02.%20text%20processing%20and%20classic%20NLP/" class="md-nav__link">
<span class="md-ellipsis">
文本处理与经典 NLP
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../03.%20embeddings%20and%20sequence%20models/" class="md-nav__link">
<span class="md-ellipsis">
嵌入与序列模型
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../04.%20transformers%20and%20language%20models/" class="md-nav__link">
<span class="md-ellipsis">
Transformer 与语言模型
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
高级文本生成
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
高级文本生成
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="目录">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
目录
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#colab-notebook" class="md-nav__link">
<span class="md-ellipsis">
编程练习(使用 CoLab 或 notebook
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9" >
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
<span class="md-ellipsis">
计算机视觉
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_9">
<span class="md-nav__icon md-icon"></span>
计算机视觉
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter%2008%3A%20computer%20vision/01.%20image%20fundamentals/" class="md-nav__link">
<span class="md-ellipsis">
图像基础
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2008%3A%20computer%20vision/02.%20convolutional%20networks/" class="md-nav__link">
<span class="md-ellipsis">
卷积网络
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2008%3A%20computer%20vision/03.%20object%20detection%20and%20segmentation/" class="md-nav__link">
<span class="md-ellipsis">
目标检测与分割
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2008%3A%20computer%20vision/04.%20vision%20transformers%20and%20generation/" class="md-nav__link">
<span class="md-ellipsis">
ViT 与生成模型
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2008%3A%20computer%20vision/05.%20video%20and%203D%20vision/" class="md-nav__link">
<span class="md-ellipsis">
视频与 3D 视觉
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_10" >
<label class="md-nav__link" for="__nav_10" id="__nav_10_label" tabindex="0">
<span class="md-ellipsis">
音频与语音
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_10_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_10">
<span class="md-nav__icon md-icon"></span>
音频与语音
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter%2009%3A%20audio%20and%20speech/01.%20digital%20signal%20processing/" class="md-nav__link">
<span class="md-ellipsis">
数字信号处理
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2009%3A%20audio%20and%20speech/02.%20automatic%20speech%20recognition/" class="md-nav__link">
<span class="md-ellipsis">
自动语音识别
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2009%3A%20audio%20and%20speech/03.%20text%20to%20speech%20and%20voice/" class="md-nav__link">
<span class="md-ellipsis">
语音合成
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2009%3A%20audio%20and%20speech/04.%20speaker%20and%20audio%20analysis/" class="md-nav__link">
<span class="md-ellipsis">
说话人与音频分析
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2009%3A%20audio%20and%20speech/05.%20source%20separation%20and%20noise/" class="md-nav__link">
<span class="md-ellipsis">
源分离与降噪
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_11" >
<label class="md-nav__link" for="__nav_11" id="__nav_11_label" tabindex="0">
<span class="md-ellipsis">
多模态学习
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_11_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_11">
<span class="md-nav__icon md-icon"></span>
多模态学习
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter%2010%3A%20multimodal%20learning/01.%20multimodal%20representations/" class="md-nav__link">
<span class="md-ellipsis">
多模态表征
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2010%3A%20multimodal%20learning/02.%20vision%20language%20models/" class="md-nav__link">
<span class="md-ellipsis">
视觉语言模型
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2010%3A%20multimodal%20learning/03.%20image%20and%20video%20tokenisation/" class="md-nav__link">
<span class="md-ellipsis">
图像与视频 Token 化
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2010%3A%20multimodal%20learning/04.%20cross-modal%20generation/" class="md-nav__link">
<span class="md-ellipsis">
跨模态生成
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2010%3A%20multimodal%20learning/05.%20unified%20multimodal%20architectures/" class="md-nav__link">
<span class="md-ellipsis">
统一多模态架构
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_12" >
<label class="md-nav__link" for="__nav_12" id="__nav_12_label" tabindex="0">
<span class="md-ellipsis">
自主系统
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_12_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_12">
<span class="md-nav__icon md-icon"></span>
自主系统
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter%2011%3A%20autonomous%20systems/01.%20perception/" class="md-nav__link">
<span class="md-ellipsis">
感知
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2011%3A%20autonomous%20systems/02.%20robot%20learning/" class="md-nav__link">
<span class="md-ellipsis">
机器人学习
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2011%3A%20autonomous%20systems/03.%20vision-language-action%20models/" class="md-nav__link">
<span class="md-ellipsis">
视觉-语言-动作模型
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2011%3A%20autonomous%20systems/04.%20self-driving/" class="md-nav__link">
<span class="md-ellipsis">
自动驾驶
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2011%3A%20autonomous%20systems/05.%20space%20and%20extreme%20robotics/" class="md-nav__link">
<span class="md-ellipsis">
太空与极端机器人
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_13" >
<label class="md-nav__link" for="__nav_13" id="__nav_13_label" tabindex="0">
<span class="md-ellipsis">
图神经网络
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_13_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_13">
<span class="md-nav__icon md-icon"></span>
图神经网络
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter%2012%3A%20graph%20neural%20networks/01.%20geometric%20deep%20learning/" class="md-nav__link">
<span class="md-ellipsis">
几何深度学习
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2012%3A%20graph%20neural%20networks/02.%20graph%20theory/" class="md-nav__link">
<span class="md-ellipsis">
图论
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2012%3A%20graph%20neural%20networks/03.%20graph%20neural%20networks/" class="md-nav__link">
<span class="md-ellipsis">
图神经网络
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2012%3A%20graph%20neural%20networks/04.%20graph%20attention%20networks/" class="md-nav__link">
<span class="md-ellipsis">
图注意力网络
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2012%3A%20graph%20neural%20networks/05.%203d%20graph%20networks/" class="md-nav__link">
<span class="md-ellipsis">
3D 图网络
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_14" >
<label class="md-nav__link" for="__nav_14" id="__nav_14_label" tabindex="0">
<span class="md-ellipsis">
计算机与操作系统
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_14_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_14">
<span class="md-nav__icon md-icon"></span>
计算机与操作系统
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter%2013%3A%20computing%20and%20OS/01.%20discrete%20maths/" class="md-nav__link">
<span class="md-ellipsis">
离散数学
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2013%3A%20computing%20and%20OS/02.%20computer%20architecture/" class="md-nav__link">
<span class="md-ellipsis">
计算机体系结构
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2013%3A%20computing%20and%20OS/03.%20operating%20systems/" class="md-nav__link">
<span class="md-ellipsis">
操作系统
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2013%3A%20computing%20and%20OS/04.%20concurrency%20and%20parallelism/" class="md-nav__link">
<span class="md-ellipsis">
并发与并行
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2013%3A%20computing%20and%20OS/05.%20programming%20languages/" class="md-nav__link">
<span class="md-ellipsis">
编程语言
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_15" >
<label class="md-nav__link" for="__nav_15" id="__nav_15_label" tabindex="0">
<span class="md-ellipsis">
数据结构与算法
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_15_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_15">
<span class="md-nav__icon md-icon"></span>
数据结构与算法
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter%2014%3A%20data%20structures%20and%20algorithms/00.%20foundations/" class="md-nav__link">
<span class="md-ellipsis">
基础
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2014%3A%20data%20structures%20and%20algorithms/01.%20arrays%20and%20hashing/" class="md-nav__link">
<span class="md-ellipsis">
数组与哈希
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2014%3A%20data%20structures%20and%20algorithms/02.%20linked%20lists%2C%20stacks%2C%20and%20queues/" class="md-nav__link">
<span class="md-ellipsis">
链表、栈与队列
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2014%3A%20data%20structures%20and%20algorithms/03.%20trees/" class="md-nav__link">
<span class="md-ellipsis">
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2014%3A%20data%20structures%20and%20algorithms/04.%20graphs/" class="md-nav__link">
<span class="md-ellipsis">
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2014%3A%20data%20structures%20and%20algorithms/05.%20sorting%20and%20search/" class="md-nav__link">
<span class="md-ellipsis">
排序与搜索
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_16" >
<label class="md-nav__link" for="__nav_16" id="__nav_16_label" tabindex="0">
<span class="md-ellipsis">
生产级软件工程
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_16_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_16">
<span class="md-nav__icon md-icon"></span>
生产级软件工程
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter%2015%3A%20production%20software%20engineering/01.%20linux%20and%20CMD/" class="md-nav__link">
<span class="md-ellipsis">
Linux 与命令行
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2015%3A%20production%20software%20engineering/02.%20git%20and%20repository%20management/" class="md-nav__link">
<span class="md-ellipsis">
Git 与仓库管理
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2015%3A%20production%20software%20engineering/03.%20codebase%20design/" class="md-nav__link">
<span class="md-ellipsis">
代码设计
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2015%3A%20production%20software%20engineering/04.%20testing%20and%20quality%20assurance/" class="md-nav__link">
<span class="md-ellipsis">
测试与质量保障
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2015%3A%20production%20software%20engineering/05.%20deployment%20and%20devops/" class="md-nav__link">
<span class="md-ellipsis">
部署与 DevOps
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_17" >
<label class="md-nav__link" for="__nav_17" id="__nav_17_label" tabindex="0">
<span class="md-ellipsis">
SIMD 与 GPU 编程
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_17_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_17">
<span class="md-nav__icon md-icon"></span>
SIMD 与 GPU 编程
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter%2016%3A%20SIMD%20and%20GPU%20programming/00.%20why%20C%2B%2B%20and%20how%20ML%20frameworks%20work/" class="md-nav__link">
<span class="md-ellipsis">
为什么是 C++ 及 ML 框架原理
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2016%3A%20SIMD%20and%20GPU%20programming/01.%20hardware%20fundamentals/" class="md-nav__link">
<span class="md-ellipsis">
硬件基础
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2016%3A%20SIMD%20and%20GPU%20programming/02.%20ARM%20and%20NEON/" class="md-nav__link">
<span class="md-ellipsis">
ARM 与 NEON
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2016%3A%20SIMD%20and%20GPU%20programming/03.%20x86%20and%20AVX/" class="md-nav__link">
<span class="md-ellipsis">
x86 与 AVX
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2016%3A%20SIMD%20and%20GPU%20programming/04.%20GPU%20architecture%20and%20CUDA/" class="md-nav__link">
<span class="md-ellipsis">
GPU 架构与 CUDA
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2016%3A%20SIMD%20and%20GPU%20programming/05.%20triton%2C%20TPUs%20and%20pallax/" class="md-nav__link">
<span class="md-ellipsis">
Triton、TPU 与 Pallas
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2016%3A%20SIMD%20and%20GPU%20programming/06.%20RISC-V%20and%20embedded%20systems/" class="md-nav__link">
<span class="md-ellipsis">
RISC-V 与嵌入式系统
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2016%3A%20SIMD%20and%20GPU%20programming/07.%20vulkan%20compute%20and%20cross-platform%20GPU/" class="md-nav__link">
<span class="md-ellipsis">
Vulkan Compute 与跨平台 GPU
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_18" >
<label class="md-nav__link" for="__nav_18" id="__nav_18_label" tabindex="0">
<span class="md-ellipsis">
AI 推理
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_18_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_18">
<span class="md-nav__icon md-icon"></span>
AI 推理
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter%2017%3A%20AI%20inference/01.%20quantisation/" class="md-nav__link">
<span class="md-ellipsis">
量化
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2017%3A%20AI%20inference/02.%20efficient%20architectures/" class="md-nav__link">
<span class="md-ellipsis">
高效架构
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2017%3A%20AI%20inference/03.%20serving%20and%20batching/" class="md-nav__link">
<span class="md-ellipsis">
服务与批处理
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2017%3A%20AI%20inference/04.%20edge%20inference/" class="md-nav__link">
<span class="md-ellipsis">
边缘推理
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2017%3A%20AI%20inference/05.%20scaling%20and%20deployment/" class="md-nav__link">
<span class="md-ellipsis">
扩缩与部署
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_19" >
<label class="md-nav__link" for="__nav_19" id="__nav_19_label" tabindex="0">
<span class="md-ellipsis">
ML 系统设计
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_19_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_19">
<span class="md-nav__icon md-icon"></span>
ML 系统设计
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter%2018%3A%20ML%20systems%20design/01.%20systems%20design%20fundamentals/" class="md-nav__link">
<span class="md-ellipsis">
系统设计基础
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2018%3A%20ML%20systems%20design/02.%20cloud%20computing/" class="md-nav__link">
<span class="md-ellipsis">
云计算
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2018%3A%20ML%20systems%20design/03.%20large%20scale%20infrastructure/" class="md-nav__link">
<span class="md-ellipsis">
大规模基础设施
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2018%3A%20ML%20systems%20design/04.%20ML%20systems%20design/" class="md-nav__link">
<span class="md-ellipsis">
ML 系统设计
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2018%3A%20ML%20systems%20design/05.%20ML%20design%20examples/" class="md-nav__link">
<span class="md-ellipsis">
ML 设计案例
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_20" >
<label class="md-nav__link" for="__nav_20" id="__nav_20_label" tabindex="0">
<span class="md-ellipsis">
应用 AI
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_20_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_20">
<span class="md-nav__icon md-icon"></span>
应用 AI
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter%2019%3A%20applied%20AI/01.%20AI%20for%20finance/" class="md-nav__link">
<span class="md-ellipsis">
AI 金融
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2019%3A%20applied%20AI/02.%20protein%20design/" class="md-nav__link">
<span class="md-ellipsis">
蛋白质设计
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2019%3A%20applied%20AI/03.%20drug%20discovery/" class="md-nav__link">
<span class="md-ellipsis">
药物发现
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2019%3A%20applied%20AI/04.%20agentic%20systems/" class="md-nav__link">
<span class="md-ellipsis">
智能体系统
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2019%3A%20applied%20AI/05.%20healthcare/" class="md-nav__link">
<span class="md-ellipsis">
医疗健康
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_21" >
<label class="md-nav__link" for="__nav_21" id="__nav_21_label" tabindex="0">
<span class="md-ellipsis">
前沿 AI
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_21_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_21">
<span class="md-nav__icon md-icon"></span>
前沿 AI
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter%2020%3A%20bleeding%20edge%20AI/01.%20quantum%20machine%20learning/" class="md-nav__link">
<span class="md-ellipsis">
量子机器学习
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2020%3A%20bleeding%20edge%20AI/02.%20neuromorphic%20computing/" class="md-nav__link">
<span class="md-ellipsis">
神经形态计算
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2020%3A%20bleeding%20edge%20AI/03.%20datacentres%20in%20space/" class="md-nav__link">
<span class="md-ellipsis">
太空数据中心
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2020%3A%20bleeding%20edge%20AI/04.%20decentralised%20AI/" class="md-nav__link">
<span class="md-ellipsis">
去中心化 AI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter%2020%3A%20bleeding%20edge%20AI/05.%20brain%20machine%20interfaces/" class="md-nav__link">
<span class="md-ellipsis">
脑机接口
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="目录">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
目录
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#colab-notebook" class="md-nav__link">
<span class="md-ellipsis">
编程练习(使用 CoLab 或 notebook
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="_1">高级文本生成<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h1>
<p><em>高级文本生成超越了普通的自回归解码,旨在提升质量、可控性和速度。本文涵盖文本扩散模型(D3PM、MDLM)、OCR、用于对齐的RLHF与DPO、长上下文方法(RoPE缩放、环形注意力)、检索增强生成,以及用于加速推理的推测性解码。</em></p>
<ul>
<li>
<p>标准的自回归生成(文件04)从左到右逐个生成token。这种方式简单有效,但本质上是串行的,无法进行全局规划,对输出的控制也有限。本文涵盖了超越普通自回归解码的方法:文本扩散模型、光学字符识别、通过人类反馈实现的可控生成、长上下文处理、检索增强生成,以及用于加速推理的推测性解码。</p>
</li>
<li>
<p><strong>文本扩散模型</strong>将扩散框架(在第08章中为图像引入)应用于离散文本。核心挑战在于文本是离散的:你不能像对像素添加噪声那样,向token添加连续的高斯噪声。有几种方法可以解决这个问题。</p>
</li>
<li>
<p><strong>D3PM</strong>(离散去噪扩散概率模型,Austin等人,2021)定义了一个直接在离散token上的前向加噪过程,使用转移矩阵。在每个前向步骤中,一个token有一定概率被另一个token替换(均匀噪声)、被掩码(吸收态)或保持不变。逆向过程学习去噪,从加噪的token预测出干净的token。在步骤<span class="arithmatex">\(t\)</span>处的转移矩阵<span class="arithmatex">\(Q_t\)</span>控制加噪过程:</p>
</li>
</ul>
<div class="arithmatex">\[q(x_t \mid x_{t-1}) = \text{Cat}(x_t ; \, x_{t-1} Q_t)\]</div>
<ul>
<li>其中<span class="arithmatex">\(\text{Cat}\)</span>表示类别分布,<span class="arithmatex">\(x\)</span>是一个one-hot向量。多步前向过程<span class="arithmatex">\(q(x_t \mid x_0)\)</span>有一个闭式形式:<span class="arithmatex">\(q(x_t \mid x_0) = \text{Cat}(x_t ; \, x_0 \bar{Q}_t)\)</span>,其中<span class="arithmatex">\(\bar{Q}_t = Q_1 Q_2 \cdots Q_t\)</span>是到步骤<span class="arithmatex">\(t\)</span>为止所有转移矩阵的乘积。训练最小化一个变分下界(ELBO),该下界在不同时间步上分解,与连续情况(第08章)类似:</li>
</ul>
<div class="arithmatex">\[\mathcal{L}_{\text{D3PM}} = D_{\text{KL}}(q(x_T \mid x_0) \| p(x_T)) + \sum_{t=2}^{T} D_{\text{KL}}(q(x_{t-1} \mid x_t, x_0) \| p_\theta(x_{t-1} \mid x_t)) - \log p_\theta(x_0 \mid x_1)\]</div>
<ul>
<li>
<p>第一项确保完全加噪后的分布与先验分布(均匀分布或全掩码)匹配。KL项的和训练模型去逆转每个加噪步骤:真实的逆向后验<span class="arithmatex">\(q(x_{t-1} \mid x_t, x_0)\)</span>可以使用贝叶斯规则和已知的转移矩阵以闭式形式计算,模型<span class="arithmatex">\(p_\theta(x_{t-1} \mid x_t)\)</span>被训练去匹配它。</p>
</li>
<li>
<p>由于这两个分布都是类别分布,KL散度就是词汇表条目上的简单求和。最后一项衡量来自最干净加噪状态的重建质量。</p>
</li>
<li>
<p><strong>MDLM</strong>(掩码扩散语言模型,Sahoo等人,2024)通过仅使用掩码作为唯一的加噪操作来简化D3PM:前向过程逐步用[MASK]token替换原始token,逆向过程预测原始token。这使文本扩散与掩码语言建模(BERT,文件04)联系起来,扩散时间步控制被掩码的token比例。在<span class="arithmatex">\(t = 0\)</span>时刻文本完全干净;在<span class="arithmatex">\(t = T\)</span>时刻文本被完全掩码。</p>
</li>
<li>
<p><strong>连续文本扩散</strong>通过在连续的嵌入空间中工作来规避离散问题。Token首先被映射到它们的嵌入向量(第06章),噪声在这个连续空间中被添加,一个去噪模型(通常是Transformer)学习逆转这个过程。在生成时,模型产生连续向量,通过找到最近的嵌入将其映射回离散token。挑战在于连续空间中的小误差可能映射到完全错误的token,因此需要仔细的舍入和裁剪。</p>
</li>
</ul>
<p><img alt="文本扩散过程" src="../../images/text_diffusion.svg" /></p>
<ul>
<li>
<p>文本扩散的吸引力在于它通过迭代精炼同时生成所有token,而不是从左到右。这允许全局连贯性和轻松填充(在段落中间生成缺失的文本),但当前文本扩散模型在长文本的生成质量上仍然落后于自回归模型。</p>
</li>
<li>
<p><strong>文本OCR</strong>(光学字符识别)是从图像中提取文本的任务。虽然传统上不归入语言生成,但现代OCR系统与NLP深度集成,并且越来越多地使用语言模型组件。</p>
</li>
<li>
<p><strong>场景文本检测</strong>在自然图像(路牌、产品标签、车牌)中定位文本区域。这很有挑战性,因为野外的文本出现在任意角度、尺寸、字体和杂乱的背景中。检测方法通常使用CNN或Transformer主干网络,围绕文本区域生成边界框或分割掩码。</p>
</li>
<li>
<p><strong>CRNN</strong>(卷积循环神经网络,Shi等人,2017)是一种经典的文本识别架构。CNN从文本图像中提取视觉特征,特征图被切片成列序列(每个水平位置一列),双向LSTM读取这个序列以建模上下文。输出使用<strong>CTC</strong>(连接时序分类)进行解码,该算法处理输入列和输出字符之间的对齐,无需显式分割。</p>
</li>
<li>
<p>CTC解决的根本问题是:模型产生<span class="arithmatex">\(T\)</span>个输出分布(每个输入列一个),但目标文本有<span class="arithmatex">\(L \leq T\)</span>个字符。</p>
</li>
<li>
<p>我们不知道哪些列对应哪些字符。CTC引入了一个<strong>空白token</strong> <span class="arithmatex">\(\epsilon\)</span>,并定义了一个多对一的映射<span class="arithmatex">\(\mathcal{B}\)</span>,该映射折叠重复字符并移除空白:<span class="arithmatex">\(\mathcal{B}(\text{\"HH-ee-ll-ll-oo\"}) = \text{\"Hello\"}\)</span>(其中\"-\"是空白)。</p>
</li>
<li>
<p>目标序列<span class="arithmatex">\(y\)</span>的概率是所有折叠后得到<span class="arithmatex">\(y\)</span>的输入对齐路径的概率之和:</p>
</li>
</ul>
<div class="arithmatex">\[P(y \mid x) = \sum_{\pi \in \mathcal{B}^{-1}(y)} \prod_{t=1}^{T} P(\pi_t \mid x)\]</div>
<ul>
<li>
<p>其中<span class="arithmatex">\(\pi\)</span>是一条长度为<span class="arithmatex">\(T\)</span>的对齐路径(每列一个标签,包括空白)。朴素地求和所有路径是指数级的,但<strong>前向算法</strong>(第05章HMM)使用动态规划在<span class="arithmatex">\(O(T \cdot L)\)</span>时间内高效地计算这个和。</p>
</li>
<li>
<p>空白token是必不可少的:没有它,像\"Hello\"中重复的\"ll\"就无法与单个\"l\"区分开来。训练最大化<span class="arithmatex">\(\log P(y \mid x)\)</span>,在推理时,通过在CTC输出上进行束搜索或贪心解码来找到最佳路径。</p>
</li>
<li>
<p><strong>文档OCR</strong>处理结构化文档(发票、表格、科学论文),除了识别字符外,还必须理解布局。像LayoutLM这样的现代系统将文本识别与空间位置特征相结合:每个token既有其文本嵌入,也有编码其在页面上<span class="arithmatex">\((x, y)\)</span>坐标的位置嵌入。这使得模型能够理解出现在\"总计:\"下面的数字就是总金额。</p>
</li>
</ul>
<p><img alt="CRNN OCR 管线" src="../../images/crnn_ocr_pipeline.svg" /></p>
<ul>
<li>
<p><strong>视觉-语言OCR</strong>模型如TrOCR将文本识别视为图像到文本的生成:视觉Transformer编码器处理图像,语言模型解码器逐字符生成文本。这利用了预训练视觉和语言模型的能力,无需手工特征工程即可处理多种文字、字体和布局。</p>
</li>
<li>
<p><strong>可控生成</strong>是引导语言模型产生具有所需属性(特定的风格、主题、情感、安全级别或事实准确性)的输出的挑战。模型应当遵循指令,同时保持流畅和连贯。</p>
</li>
<li>
<p><strong>针对文本的分类器无关引导(CFG</strong> 改编自图像生成中的技术。在训练期间,条件信号(如提示词)以一定比例被随机丢弃,从而在同一个模型中同时训练条件模型和无条件模型。在推理时,输出logits被插值:</p>
</li>
</ul>
<div class="arithmatex">\[\text{logits}_{\text{guided}} = (1 + w) \cdot \text{logits}_{\text{conditional}} - w \cdot \text{logits}_{\text{unconditional}}\]</div>
<ul>
<li>
<p>其中<span class="arithmatex">\(w &gt; 0\)</span>放大了条件的影响。越大的<span class="arithmatex">\(w\)</span>使输出更强烈地遵循提示词,但降低了多样性。</p>
</li>
<li>
<p><strong>RLHF</strong>(基于人类反馈的强化学习,Ouyang等人,2022)是对齐语言模型与人类偏好的主流方法。该过程分为三个阶段:</p>
</li>
<li>
<p>首先,<strong>监督微调(SFT</strong>:在高质量人工编写的提示-回复数据集上对基础语言模型进行微调。</p>
</li>
<li>
<p>其次,<strong>奖励模型训练</strong>:收集人类比较数据(给定提示<span class="arithmatex">\(x\)</span>和两个回复<span class="arithmatex">\(y_1, y_2\)</span>,哪个更好?)并训练一个奖励模型<span class="arithmatex">\(r_\phi(x, y)\)</span>来预测人类偏好。奖励模型使用成对排序损失进行训练:</p>
</li>
</ul>
<div class="arithmatex">\[\mathcal{L}_{\text{RM}} = -\log \sigma(r_\phi(x, y_w) - r_\phi(x, y_l))\]</div>
<ul>
<li>
<p>其中<span class="arithmatex">\(y_w\)</span>是更受偏好的回复,<span class="arithmatex">\(y_l\)</span>是不受偏好的回复。</p>
</li>
<li>
<p>第三,<strong>RL微调</strong>:优化语言模型以最大化奖励,同时保持接近SFT模型(以防止模式崩塌)。这使用带有KL惩罚的PPO(近端策略优化,来自第06章):</p>
</li>
</ul>
<div class="arithmatex">\[\mathcal{L}_{\text{RL}} = -\mathbb{E}\left[r_\phi(x, y) - \beta \, D_{\text{KL}}(\pi_\theta \| \pi_{\text{SFT}})\right]\]</div>
<ul>
<li>KL项防止模型偏离基础模型太远,并防止模型利用奖励模型的缺陷(\"奖励破解\")。</li>
</ul>
<p><img alt="RLHF 管线" src="../../images/rlhf_pipeline.svg" /></p>
<ul>
<li><strong>DPO</strong>(直接偏好优化,Rafailov等人,2023)通过完全消除奖励模型来简化RLHF。关键的数学洞见是,上述KL约束的RL目标有一个闭式最优策略:</li>
</ul>
<div class="arithmatex">\[\pi^\ast(y \mid x) = \frac{1}{Z(x)} \pi_{\text{ref}}(y \mid x) \exp\!\left(\frac{r(x, y)}{\beta}\right)\]</div>
<ul>
<li>其中<span class="arithmatex">\(Z(x)\)</span>是一个归一化配分函数。整理上式求解奖励得<span class="arithmatex">\(r(x, y) = \beta \log \frac{\pi^\ast(y \mid x)}{\pi_{\text{ref}}(y \mid x)} + \beta \log Z(x)\)</span>。将这个隐式奖励代入Bradley-Terry偏好模型<span class="arithmatex">\(P(y_w \succ y_l) = \sigma(r(x, y_w) - r(x, y_l))\)</span>会导致难以处理的<span class="arithmatex">\(Z(x)\)</span>项相互抵消,直接得到DPO损失:</li>
</ul>
<div class="arithmatex">\[\mathcal{L}_{\text{DPO}} = -\log \sigma\!\left(\beta \log \frac{\pi_\theta(y_w \mid x)}{\pi_{\text{ref}}(y_w \mid x)} - \beta \log \frac{\pi_\theta(y_l \mid x)}{\pi_{\text{ref}}(y_l \mid x)}\right)\]</div>
<ul>
<li>
<p>这在数学上等价于RLHF,但将奖励模型和RL训练合并为一个单一的监督步骤。</p>
</li>
<li>
<p>sigmoid内部的表达式可以理解为:"增加偏好回复的相对概率,降低不偏好回复的相对概率,这是相对于参考模型而言的。"</p>
</li>
<li>
<p>参数<span class="arithmatex">\(\beta\)</span>控制策略可以偏离参考模型的程度。在实践中,DPO实现更简单(只需计算当前模型和参考模型对两个完成序列的对数概率),并且避免了PPO训练的不稳定性。</p>
</li>
<li>
<p><strong>Constitutional AI</strong>(Bai等人,2022)自动化了对齐过程的某些部分。它不再收集人类比较数据,而是让语言模型本身根据一组原则("宪法")来批评和修订自己的输出,例如"选择危害较小的回复"。然后,AI生成的比较数据被用于偏好训练(RLAIF:基于AI反馈的强化学习)。</p>
</li>
<li>
<p><strong>长上下文方法</strong>解决了标准自注意力的<span class="arithmatex">\(O(n^2)\)</span>内存和计算成本问题,这限制了序列长度。当<span class="arithmatex">\(n\)</span>增长到数万或数十万个token时,标准注意力变得不可行。</p>
</li>
<li>
<p><strong>稀疏注意力</strong>将稠密的<span class="arithmatex">\(n \times n\)</span>注意力矩阵替换为一种稀疏模式,其中每个token只关注其他token的一个子集。常见的模式包括<strong>局部注意力</strong>(每个token关注一个固定大小的相邻窗口)、<strong>步长注意力</strong>(关注每隔<span class="arithmatex">\(k\)</span>个token)和<strong>随机注意力</strong>(关注一个随机子集)。这些模式的组合(用于BigBird、Longformer)实现了<span class="arithmatex">\(O(n)\)</span><span class="arithmatex">\(O(n \sqrt{n})\)</span>的复杂度,同时保持了捕获局部和全局依赖关系的能力。</p>
</li>
</ul>
<p><img alt="稀疏注意力模式" src="../../images/sparse_attention_patterns.svg" /></p>
<ul>
<li>
<p><strong>滑动窗口注意力</strong>将每个token限制为只关注其之前的<span class="arithmatex">\(w\)</span>个token(其局部窗口)。这是<span class="arithmatex">\(O(nw)\)</span>而不是<span class="arithmatex">\(O(n^2)\)</span>,但长距离信息必须通过跨层的重叠窗口传播。对于<span class="arithmatex">\(L\)</span>层和窗口大小<span class="arithmatex">\(w\)</span>,有效感受野为<span class="arithmatex">\(L \times w\)</span>个token。</p>
</li>
<li>
<p><strong>环形注意力</strong>通过将设备排列成环形拓扑结构,将长序列分布到多个设备上。每个设备持有序列的一个块,并为其块计算注意力,同时将键值块发送给环中的下一个设备。这种方式将计算与通信重叠,允许任意长度的序列,仅受所有设备总内存的限制,而不受任何单个设备内存的限制。</p>
</li>
<li>
<p><strong>记忆增强模型</strong>通过为Transformer配备一个外部记忆库来扩展上下文。在每个层中,模型可以使用注意力从这个记忆库中读取和写入。Memorizing Transformers缓存来自先前块的键值对,并在后续块中关注它们,从而有效地将上下文扩展到训练窗口之外。检索是近似的(使用缓存键的<span class="arithmatex">\(k\)</span>近邻搜索)以保持高效。</p>
</li>
<li>
<p>上述方法是处理长上下文的<strong>架构</strong>解决方案。同样重要的是模型如何被<strong>训练</strong>以有效使用长上下文。</p>
</li>
<li>
<p><strong>渐进式上下文扩展</strong>是标准方法。从一开始就在非常长的序列上训练代价高昂(<span class="arithmatex">\(O(n^2)\)</span>的注意力成本),因此模型在较短的上下文长度上预训练(通常为4K-8K token),然后通过<strong>继续预训练</strong>分阶段扩展到目标长度。</p>
</li>
<li>
<p>Llama 3.1从8K扩展到128K,使用了800B token,并逐步增加序列长度。DeepSeek-V3在4K处训练,然后扩展到32K,再到128K。</p>
</li>
<li>
<p>每个阶段使用适中的token数量(相对于完整的预训练预算),因为模型只需要学习如何使用更长的位置,而不是重新学习语言本身。</p>
</li>
<li>
<p>在扩展过程中,位置编码必须进行调整。<strong>RoPE插值</strong>缩小位置索引,使得模型看到与训练时相同的旋转角度,只是分布在更长的序列上。如果模型在长度<span class="arithmatex">\(L\)</span>上训练,你想要扩展到<span class="arithmatex">\(L' = 4L\)</span>,你可以将所有位置索引除以4。</p>
</li>
<li>
<p>这意味着模型永远不会遇到未见过的旋转角度,但相邻位置之间的有效分辨率会下降。</p>
</li>
<li>
<p><strong>RoPE外推</strong>保持原始位置索引不变,直接将RoPE应用于超出<span class="arithmatex">\(L\)</span>的位置,依赖模型对未见角度的泛化能力。</p>
</li>
<li>
<p>插值要稳定得多;在不调整基频(ABF)的情况下,外推会迅速退化。</p>
</li>
<li>
<p><strong>YaRN</strong>Yet another RoPE extensioN,又一种RoPE扩展)改进了朴素插值,因为它认识到并非所有RoPE维度都应被同等对待。</p>
</li>
<li>
<p>高频维度(在<span class="arithmatex">\(\theta_i = \theta_{\text{base}}^{-2i/d}\)</span>中较小的<span class="arithmatex">\(i\)</span>)在训练长度内旋转多次,可以很好地外推。</p>
</li>
<li>
<p>低频维度(较大的<span class="arithmatex">\(i\)</span>)旋转缓慢,对长度扩展更敏感。</p>
</li>
<li>
<p>YaRN只插值低频维度,外推高频维度,并对注意力logits应用温度缩放<span class="arithmatex">\(t\)</span>以补偿分布偏移:</p>
</li>
</ul>
<div class="arithmatex">\[\text{score}'_{ij} = \frac{q_i^T k_j}{t \sqrt{d_k}}\]</div>
<ul>
<li>
<p>其中<span class="arithmatex">\(t &gt; 1\)</span>展平了注意力分布,防止模型在位置信号被压缩时过于尖锐地关注附近的token。</p>
</li>
<li>
<p><strong>长上下文数据策展</strong>是一个关键且常被低估的挑战。大多数预训练语料库由短文档组成(新闻文章、网页、社交媒体帖子)。</p>
</li>
<li>
<p>长上下文训练需要实际利用完整上下文窗口的数据组合:书籍、代码仓库、长篇科学文章、多轮对话日志,以及主题相关的拼接文档。</p>
</li>
<li>
<p>如果模型仅在填充或打包以填满上下文窗口的短文档上训练,它会学会忽略远处的token,因为它们从来都不相关。</p>
</li>
<li>
<p><strong>序列打包</strong>是一种训练效率技术:多个文档拼接成一个训练序列以避免填充浪费,使用注意力掩码防止跨文档的注意力。</p>
</li>
<li>
<p>对于长上下文训练,打包策略很重要:打包许多不相关的短文档会教模型将远处的token视为噪声,而打包更少的、真正长的文档则教它使用完整的上下文。</p>
</li>
<li>
<p>一个已知的失败模式是<strong>"中间迷失"</strong>现象(Liu等人,2023):语言模型能够有效利用上下文窗口开头和结尾的信息,但在处理位于中间的信息时表现困难。</p>
</li>
<li>
<p>这类似于人类记忆中的序列位置效应(首因效应和近因效应)。</p>
</li>
<li>
<p>它部分源于训练数据的分布(重要信息通常在文档的开头或结尾),部分源于注意力模式集中于邻近token和初始token。</p>
</li>
<li>
<p>通过在不同位置放置关键信息进行长上下文训练可以缓解但无法完全解决这个问题。</p>
</li>
<li>
<p><strong>大海捞针</strong>评估测试模型是否能够从长长的干扰上下文("大海")中检索出位于不同位置的特定事实("针")。</p>
</li>
<li>
<p>具有真正长上下文能力的模型应该无论针放在哪里都能实现近乎完美的检索。</p>
</li>
<li>
<p>这个测试清晰地揭示了"中间迷失"效应,并被用作上下文扩展方法的基准。</p>
</li>
<li>
<p><strong>预训练后的长上下文微调</strong>使用有针对性的SFT数据:长多轮对话、证据分散在数千个token中的文档问答、长篇摘要,以及仓库级别的代码理解。</p>
</li>
<li>
<p>Qwen3在此阶段使用<strong>双块注意力(DCA</strong>,它将长序列作为成对的块进行处理,其中块内注意力是完整的,块间注意力是高效的,在微调期间实现了4倍的有效序列容量。</p>
</li>
<li>
<p><strong>状态空间模型(SSM</strong>提供了一种根本不同的长序列建模方法。它们不是修改注意力,而是用受连续时间控制理论启发的线性动力系统完全取代注意力。</p>
</li>
<li>
<p>一个SSM将输入序列<span class="arithmatex">\(u(t)\)</span>通过一个潜在状态<span class="arithmatex">\(x(t) \in \mathbb{R}^N\)</span>映射到输出<span class="arithmatex">\(y(t)\)</span>,其控制方程为:</p>
</li>
</ul>
<div class="arithmatex">\[x'(t) = Ax(t) + Bu(t), \quad y(t) = Cx(t) + Du(t)\]</div>
<ul>
<li>
<p>其中<span class="arithmatex">\(A \in \mathbb{R}^{N \times N}\)</span>是状态转移矩阵,<span class="arithmatex">\(B \in \mathbb{R}^{N \times 1}\)</span>是输入投影,<span class="arithmatex">\(C \in \mathbb{R}^{1 \times N}\)</span>是输出投影,<span class="arithmatex">\(D\)</span>是一个跳跃连接。</p>
</li>
<li>
<p>为了将其应用于离散序列(token),使用步长<span class="arithmatex">\(\Delta\)</span>对连续系统进行<strong>离散化</strong>。零阶保持离散化给出:</p>
</li>
</ul>
<div class="arithmatex">\[\bar{A} = \exp(\Delta A), \quad \bar{B} = (\Delta A)^{-1}(\exp(\Delta A) - I) \cdot \Delta B\]</div>
<ul>
<li>
<p>离散递归变为<span class="arithmatex">\(x_k = \bar{A} x_{k-1} + \bar{B} u_k\)</span><span class="arithmatex">\(y_k = C x_k + D u_k\)</span>,这看起来像一个RNN:每次用一个隐藏状态处理一个token。</p>
</li>
<li>
<p>与RNN不同,这个递归也可以展开为一个<strong>全局卷积</strong>:因为系统是线性的,输出为<span class="arithmatex">\(y = \bar{K} \ast u\)</span>,其中核<span class="arithmatex">\(\bar{K} = (C\bar{B}, \, C\bar{A}\bar{B}, \, C\bar{A}^2\bar{B}, \ldots)\)</span>仅取决于固定参数。</p>
</li>
<li>
<p>这种<strong>双重视角</strong>——用于高效自回归推理的递归(每步<span class="arithmatex">\(O(1)\)</span>)和用于高效并行训练的卷积(通过FFT实现<span class="arithmatex">\(O(n \log n)\)</span>)——是SSM的核心洞见。</p>
</li>
</ul>
<p><img alt="SSM双重视角:推理时的递归、训练时的卷积,以及Mamba的选择性扩展" src="../../images/ssm_dual_view.svg" /></p>
<ul>
<li>
<p><strong>S4</strong>(序列建模的结构化状态空间,Gu等人,2022)通过解决关键的数值挑战使SSM变得实用:状态矩阵<span class="arithmatex">\(A\)</span>必须捕获长距离依赖关系,但朴素地参数化会导致梯度消失或爆炸(与普通RNN相同的问题)。</p>
</li>
<li>
<p>S4使用<strong>HiPPO</strong>(高阶多项式投影算子)矩阵初始化<span class="arithmatex">\(A\)</span>,该矩阵来源于连续信号最优多项式逼近的理论。HiPPO矩阵具有特定的结构,被证明能使状态以优雅衰减的方式维持整个输入历史的压缩表示:</p>
</li>
</ul>
<div class="arithmatex">\[
A_{nk} = -\begin{cases} (2n+1)^{1/2}(2k+1)^{1/2} & \text{if } n > k \\ n+1 & \text{if } n = k \\ 0 & \text{if } n < k \end{cases}
\]</div>
<ul>
<li>
<p>这种下三角结构确保状态使用勒让德多项式作为信号的在线逼近器。计算长核的<span class="arithmatex">\(\bar{A}^k\)</span>代价高昂,因此S4利用HiPPO矩阵可以分解为低秩项和对角项之和的事实,实现了<span class="arithmatex">\(O(n \log n)\)</span>的核计算。</p>
</li>
<li>
<p><strong>Mamba</strong>Gu和Dao2023)引入了<strong>选择性状态空间</strong>这一关键创新:使SSM参数依赖于输入。在S4中,矩阵<span class="arithmatex">\(A\)</span><span class="arithmatex">\(B\)</span><span class="arithmatex">\(C\)</span>和步长<span class="arithmatex">\(\Delta\)</span>是固定的——无论内容如何,相同的动力学应用于每个token。Mamba使<span class="arithmatex">\(B\)</span><span class="arithmatex">\(C\)</span><span class="arithmatex">\(\Delta\)</span>成为输入的函数:</p>
</li>
</ul>
<div class="arithmatex">\[B_k = \text{Linear}(u_k), \quad C_k = \text{Linear}(u_k), \quad \Delta_k = \text{softplus}(\text{Linear}(u_k))\]</div>
<ul>
<li>
<p>这种选择性允许模型在每个位置决定哪些信息存入状态、哪些信息忽略——类似于注意力如何选择相关token,但没有二次成本。步长<span class="arithmatex">\(\Delta_k\)</span>控制着"门":大的<span class="arithmatex">\(\Delta\)</span>导致状态强烈地整合当前输入(连续动力学前进一大步,有效重置状态),而小的<span class="arithmatex">\(\Delta\)</span>则保留现有状态并忽略当前输入。</p>
</li>
<li>
<p>权衡之处在于,依赖于输入的参数打破了卷积视角(核不再固定),因此Mamba无法使用基于FFT的训练。相反,它使用一种<strong>硬件感知的并行扫描</strong>算法,利用递归的结合律:状态更新<span class="arithmatex">\((x_k, u_k) \mapsto x_{k+1}\)</span>可以表示为一串结合性操作,并使用前缀和(扫描)进行并行化,类似于硬件设计中的并行前缀加法。这在GPU上以<span class="arithmatex">\(O(n)\)</span>时间和<span class="arithmatex">\(O(\log n)\)</span>深度运行,几乎与卷积的效率相当。</p>
</li>
<li>
<p>Mamba实现了真正每token <span class="arithmatex">\(O(1)\)</span>的推理(只需更新固定大小的状态,没有随上下文增长的KV缓存),使其在长序列长度上从根本上比Transformer更节省内存。状态大小<span class="arithmatex">\(N\)</span>(通常为16)远小于Transformer的KV缓存(存储<span class="arithmatex">\(O(n \cdot d)\)</span>个值)。在实践中,在相同的参数量下,Mamba在语言建模基准上的质量达到或超过Transformer,并且在长序列上推理速度显著更快。</p>
</li>
<li>
<p><strong>混合架构</strong>将SSM层与注意力层相结合,使用SSM处理大部分层(高效的长距离传播),并穿插少量注意力层(精确的基于内容的检索)。像Jamba和Zamba这样的模型交错了Mamba和Transformer块,在保持大部分推理效率优势的同时,实现了比纯SSM更好的质量。这表明注意力和SSM捕获了互补的能力:SSM擅长平滑的长距离状态传播,而注意力擅长精确的、依赖于内容的查找。</p>
</li>
<li>
<p><strong>检索增强生成(RAG</strong>通过在推理时让语言模型访问外部知识库,来解决语言模型的知识局限性。RAG不是仅依赖于训练期间编码在模型参数中的知识,而是检索相关文档并基于它们进行条件生成。</p>
</li>
<li>
<p>经典的<strong>检索器-阅读器架构</strong>有两个组件。<strong>检索器</strong>接收查询并从语料库中获取最相关的top-<span class="arithmatex">\(k\)</span>个段落。<strong>阅读器</strong>(一个语言模型)基于查询和检索到的段落生成答案。检索器可以使用稀疏方法(BM25,它扩展了文件02中的TF-IDF)或稠密方法。</p>
</li>
<li>
<p><strong>稠密段落检索(DPR</strong>使用双编码器架构:一个编码器将问题映射为向量,另一个将段落映射为向量。两者通常都是基于BERT的。在索引时,所有段落被编码并存储。在查询时,问题被编码,使用近似最近邻搜索(如FAISS)找到最近的段落。相似度度量是问题向量和段落向量之间的点积。</p>
</li>
<li>
<p><strong>分块策略</strong>显著影响检索质量。文档必须被分割成足够小以使检索器能够处理的段落,但又要足够大以包含完整的思想。固定大小的分块(例如,256个token,50个token重叠)很简单,但可能笨拙地分割句子。语义分块在段落或章节边界处分割。层次化分块在不同粒度上创建一个摘要树。</p>
</li>
</ul>
<p><img alt="RAG 架构" src="../../images/rag_architecture.svg" /></p>
<ul>
<li>
<p>RAG有几个优势:知识库可以更新而无需重新训练模型,模型可以引用来源,并且因为模型可以基于检索到的文本进行回答,幻觉减少了。主要挑战是检索质量(如果检索到错误的段落,模型可能会自信地给出错误答案)和延迟(检索为推理增加了一个步骤)。</p>
</li>
<li>
<p><strong>推测性解码</strong>通过使用一个小的、快速的<strong>草稿模型</strong>并行提出多个token,然后由大的<strong>目标模型</strong>在单个前向传播中进行验证,从而加速自回归生成。</p>
</li>
<li>
<p>该算法的工作方式如下:草稿模型自回归地生成<span class="arithmatex">\(k\)</span>个候选token(因为草稿模型很小,所以这很快)。</p>
</li>
<li>
<p>然后,目标模型在单个前向传播中同时对全部<span class="arithmatex">\(k\)</span>个token进行评分(因为工作被批处理,所以这很高效)。</p>
</li>
<li>
<p>对于从草稿分布<span class="arithmatex">\(p_d(t)\)</span>中采样的每个候选token <span class="arithmatex">\(t\)</span>,它以概率<span class="arithmatex">\(\min(1, \, p_{\text{target}}(t) / p_d(t))\)</span>被接受。如果被拒绝,则从<strong>调整后分布</strong><span class="arithmatex">\(p_{\text{adj}}(t) = \max(0, \, p_{\text{target}}(t) - p_d(t))\)</span>(经归一化)中重新采样一个修正后的token。</p>
</li>
<li>
<p>这种接受-拒绝方案保证了输出分布与单独使用目标模型完全相同。</p>
</li>
<li>
<p>为了理解原因,考虑生成token <span class="arithmatex">\(t\)</span>的有效概率。它可以直接被接受(概率<span class="arithmatex">\(p_d(t) \cdot \min(1, p_{\text{target}}(t)/p_d(t))\)</span>),或者通过重新采样产生。</p>
</li>
<li>
<p>对于<span class="arithmatex">\(p_{\text{target}}(t) \leq p_d(t)\)</span>的token,直接接受贡献<span class="arithmatex">\(p_{\text{target}}(t)\)</span>。对于<span class="arithmatex">\(p_{\text{target}}(t) &gt; p_d(t)\)</span>的token,直接接受贡献<span class="arithmatex">\(p_d(t)\)</span>,重新采样贡献剩余部分<span class="arithmatex">\(p_{\text{target}}(t) - p_d(t)\)</span>(在考虑拒绝概率之后)。</p>
</li>
<li>
<p>在这两种情况下,生成<span class="arithmatex">\(t\)</span>的总概率等于<span class="arithmatex">\(p_{\text{target}}(t)\)</span>。草稿模型只影响速度,不影响质量。</p>
</li>
</ul>
<p><img alt="推测性解码" src="../../images/speculative_decoding.svg" /></p>
<ul>
<li>
<p>加速取决于接受率:如果草稿模型与目标模型对齐良好,大多数token被接受,墙上时钟时间大致等于草稿模型的时间。典型加速为2-3倍,且质量无下降。</p>
</li>
<li>
<p><strong>Medusa</strong>(Cai等人,2024)采用不同的方法:不是使用单独的草稿模型,而是在目标模型本身中添加多个轻量级的预测头。每个头同时预测不同的未来token位置(提前<span class="arithmatex">\(k = 1, 2, 3, \ldots\)</span>步)。在每一步,Medusa使用树状结构提出若干候选延续,通过目标模型注意力层的单个前向传播验证哪些候选是一致的。这完全避免了对单独草稿模型的需求。</p>
</li>
<li>
<p><strong>并行生成</strong>方法更广泛地旨在打破自回归解码的串行瓶颈。雅可比解码使用猜测初始化所有位置,并并行地迭代精炼直到收敛,将生成视为一个不动点迭代。非自回归模型(NAT)在单个前向传播中同时生成所有token,但通常遭受质量下降的问题,需要像迭代精炼、CTC损失或来自自回归教师的知识蒸馏这样的技术来缩小差距。</p>
</li>
<li>
<p>上述技术——对齐、长上下文、检索、高效解码、状态空间模型——在现代生产级LLM中结合在一起。</p>
</li>
<li>
<p>本文的其余部分审视了前沿模型的架构创新,展示了文件01-04中的理论思想以及上述方法是如何在实践中结合起来的。</p>
</li>
<li>
<p><strong>分组查询注意力(GQA</strong> 是采用最广泛的注意力效率技术。标准多头注意力(MHA)为每个头维护独立的键和值投影,每个token需要缓存<span class="arithmatex">\(n_{\text{heads}} \times d_{\text{head}}\)</span>个值。GQA将多个查询头分组以共享一个键-值头。</p>
</li>
<li>
<p>使用64个查询头和8个KV头(Llama 3、Qwen、Gemma中的常见配置),每个KV头被8个查询头共享,与MHA相比KV缓存减少了8倍。</p>
</li>
<li>
<p>输出质量几乎与MHA相同,因为查询仍然可以关注不同的模式,它们只是共享相同的键-值子空间。多查询注意力(MQA)是所有查询使用单个KV头的极端情况,但GQA提供了更好的质量-效率权衡。</p>
</li>
<li>
<p><strong>多头潜在注意力(MLA</strong>,由DeepSeek-V2引入,实现了更激进的KV缓存压缩。MLA不是缓存完整的键-值投影(即使使用GQA),而是将隐藏状态下投影为一个低秩的<strong>潜在向量</strong><span class="arithmatex">\(c_t \in \mathbb{R}^{d_c}\)</span>,其中<span class="arithmatex">\(d_c \ll n_{\text{heads}} \times d_{\text{head}}\)</span></p>
</li>
</ul>
<div class="arithmatex">\[c_t = W_{\text{down}} \, h_t\]</div>
<ul>
<li>
<p>仅缓存这个压缩向量。在注意力计算时,通过上投影重建完整的键和值表示:<span class="arithmatex">\(k_t = W_{\text{up}}^K c_t\)</span><span class="arithmatex">\(v_t = W_{\text{up}}^V c_t\)</span>。在DeepSeek-V3中(671B总参数,37B激活参数),压缩维度为<span class="arithmatex">\(d_c = 512\)</span>,而完整MHA需要<span class="arithmatex">\(128 \times 128 = 16{,}384\)</span>KV缓存减少了93%。</p>
</li>
<li>
<p>一个微妙的点:标准RoPE依赖于位置,与共享压缩不兼容,因此MLA使用<strong>解耦的RoPE</strong>:查询和键的一个小的独立流(每头64维)通过RoPE携带位置信息,而表示的主要部分通过压缩的潜在路径流动。</p>
</li>
</ul>
<p><img alt="注意力KV缓存策略:MHA、GQA和MLA比较" src="../../images/mla_vs_gqa.svg" /></p>
<ul>
<li>
<p><strong>大规模位置编码</strong>已经从原始的正弦方案显著分化。所有前沿模型都使用<strong>RoPE</strong>(文件04),但针对长上下文有关键修改。原始RoPE公式<span class="arithmatex">\(\theta_i = \theta_{\text{base}}^{-2i/d}\)</span>中的基频<span class="arithmatex">\(\theta_{\text{base}}\)</span>通常为10,000,这限制了超出训练长度的外推能力。</p>
</li>
<li>
<p><strong>调整基频(ABF</strong>只是将<span class="arithmatex">\(\theta_{\text{base}}\)</span>增加到500,000Llama 3)或1,000,000Qwen3、Gemma 3),拉伸旋转周期,使得模型在训练期间遇到更少的完整旋转,从而能够外推得更远。</p>
</li>
<li>
<p><strong>YaRN</strong>Yet another RoPE extensioN,又一种RoPE扩展)应用依赖于频率的插值:低频维度被插值(缩小比例),高频维度被外推,同时温度因子调整注意力分布。DeepSeek-V3、Qwen和Kimi K2都使用基于YaRN的扩展,从预训练时的4K-8K上下文达到128K上下文。</p>
</li>
<li>
<p><strong>iRoPE</strong>(交错RoPE),由Llama 4引入,采取了更激进的方法:每4个注意力层中有一个<strong>完全不使用位置编码</strong>(NoPE),而其他层使用标准RoPE配合分块注意力。</p>
</li>
<li>
<p>NoPE层可以在没有任何位置偏差的情况下关注所有位置,而RoPE层提供局部排序。结合推理时的温度缩放,这使得Llama 4 Scout的1000万token上下文窗口成为可能——比任何纯RoPE方法都高出几个数量级。</p>
</li>
<li>
<p><strong>大规模混合专家</strong>已成为前沿模型的主导架构(文件04介绍了MoE基础)。关键的设计选择是专家数量、路由稀疏性和负载均衡。</p>
</li>
<li>
<p><strong>路由稀疏性</strong>差异显著:DeepSeek-V3使用256个专家,top-8路由(32倍稀疏);Qwen3使用128个专家,top-8路由(16倍稀疏);Mixtral使用8个专家,top-2路由(4倍稀疏);Llama 4 Maverick使用128个专家,top-1加一个共享专家(128倍稀疏)。</p>
</li>
<li>
<p>更高的稀疏性意味着在相同激活计算量下拥有更多总参数,但需要更仔细的负载均衡和通信基础设施。</p>
</li>
<li>
<p><strong>无辅助损失的负载均衡</strong>DeepSeek-V3)取代了传统的负载均衡损失(文件04),后者被发现会降低模型质量。每个专家维护一个动态偏置项,在每个训练步骤进行调整:过载的专家其偏置降低(接收更少的token),欠载的专家其偏置增加。这实现了均衡的路由,没有任何辅助损失污染主要训练信号。</p>
</li>
<li>
<p><strong>共享专家</strong>出现在大多数MoE设计中:一个或多个专家FFN处理每个token,无论路由结果如何。这些处理所有token都需要的常见模式(基本语法、功能词),使得路由专家可以专注于 specialization。Llama 4使用1个共享专家加每个token 1个路由专家(非常稀疏);DeepSeek-V3使用1个共享加8个路由。</p>
</li>
<li>
<p><strong>交替稠密层和MoE层</strong>提供了另一个设计维度。Gemma 2和3交替使用局部/全局注意力层(Gemma 3中比例为5:1,其中局部层使用1024 token的滑动窗口,只有全局层缓存完整的128K上下文)。</p>
</li>
<li>
<p>Llama 4 Maverick交错使用稠密FFN层和MoE层。Kimi K2使用混合稀疏层(一个稠密层穿插在专家层之间)。这种异构设计允许不同层服务于不同的功能。</p>
</li>
<li>
<p><strong>多token预测(MTP</strong>,用于DeepSeek-V3,训练模型不仅预测下一个token,还预测后面的token。在每个位置,一个次级预测模块(共享主模型的嵌入)预测一个额外的未来token。MTP损失的权重是主下一个token损失的0.1-0.3倍。除了在训练期间改善表示质量外,MTP头还可以在推理时作为推测性解码的草稿头,提供免费的加速。</p>
</li>
<li>
<p><strong>知识蒸馏</strong>是一种训练策略,其中大型"教师"模型的输出指导较小"学生"模型的训练。Gemma 2和3广泛使用蒸馏:较小的模型(2B、4B)在计算最优数据量的50倍上训练,使用教师的概率分布作为软目标。这就是为什么Gemma 3-4B在质量上匹配Gemma 2-27B。</p>
</li>
<li>
<p>蒸馏损失替代或补充了标准交叉熵:学生最小化其输出分布与教师分布之间的KL散度:</p>
</li>
</ul>
<div class="arithmatex">\[\mathcal{L}_{\text{distill}} = D_{\text{KL}}(p_{\text{teacher}}(\cdot \mid x) \| p_{\text{student}}(\cdot \mid x))\]</div>
<ul>
<li>
<p>DeepSeek-R1将其671B推理模型蒸馏到小至1.5B的稠密模型中,使用了80万条精选的思维链样本,产生了推理能力异常强的小模型。</p>
</li>
<li>
<p><strong>基于强化学习的推理</strong>代表了LLM能力中最显著的最新进展。DeepSeek-R1证明,在基础模型上进行纯强化学习(无需监督微调)可以引出思维链推理、自我验证和纠错行为——当模型因给出正确的最终答案而获得奖励时,这些行为会自发涌现。</p>
</li>
<li>
<p>DeepSeek-R1使用<strong>GRPO</strong>(组相对策略优化),它消除了PPO所需的价值网络。对于每个提示,GRPO采样一组<span class="arithmatex">\(G\)</span>个输出,计算它们的奖励,并在组内归一化优势值:</p>
</li>
</ul>
<div class="arithmatex">\[A_i = \frac{r_i - \text{mean}(r_1, \ldots, r_G)}{\text{std}(r_1, \ldots, r_G)}\]</div>
<ul>
<li>
<p>然后策略梯度使用这些组相对优势值,配合一个裁剪目标(类似于PPO的裁剪)。</p>
</li>
<li>
<p>消除评论家网络将RL训练的内存和计算需求减半,使得在671B参数模型上进行RL训练变得可行。</p>
</li>
<li>
<p>一个关键的设计选择:DeepSeek-R1使用<strong>基于规则的奖励</strong>(对照标准答案检查数学答案、运行代码测试用例)而不是神经奖励模型,因为神经奖励模型在此规模下被发现容易受到奖励破解的影响。</p>
</li>
<li>
<p><strong>Qwen3的混合思考模式</strong>将推理(使用<code>&lt;think&gt;</code>标签进行逐步思维链)和快速直接回复整合到一个模型中,允许用户控制一个"思考预算",在延迟和推理深度之间进行权衡。</p>
</li>
<li>
<p>这是通过在思考和思考数据上训练实现的,而不是通过单独的模型检查点。</p>
</li>
<li>
<p><strong>大规模训练稳定化</strong>需要超越标准实践的新技术。<strong>Logits软裁剪</strong>Gemma 2)将注意力分数通过<span class="arithmatex">\(s \cdot \tanh(\text{logits} / s)\)</span>处理,软裁剪值<span class="arithmatex">\(s\)</span>(通常为30-50),以防止无界增长。</p>
</li>
<li>
<p><strong>QK归一化</strong>(Qwen3)在计算注意力分数之前对查询和键向量应用RMSNorm,取代了对QKV偏置的需求。<strong>QK裁剪</strong>Kimi K2的MuonClip优化器)在训练期间监控最大注意力logits,当查询-键权重矩阵超过阈值时对其进行重新缩放,使得1T参数模型的预训练能够稳定进行,且没有不稳定事件。</p>
</li>
<li>
<p><strong>FP8混合精度训练</strong>DeepSeek-V3)在前向和反向传播中使用8位浮点数进行计算密集的矩阵乘法,同时将主权重保持在更高精度。</p>
</li>
<li>
<p>与BF16/FP16训练相比,这大致将吞吐量提升了一倍,且质量损失可忽略不计。DeepSeek-V3使用仅280万H800 GPU小时训练了其671B参数模型——只是同类模型的一小部分——这主要归功于这一优化和其他工程优化。</p>
</li>
<li>
<p><strong>FP8混合精度训练</strong>DeepSeek-V3)在前向和反向传播中使用8位浮点数进行计算密集的矩阵乘法,同时将主权重保持在更高精度。</p>
</li>
<li>
<p>与BF16/FP16训练相比,这大致将吞吐量提升了一倍,且质量损失可忽略不计。DeepSeek-V3使用仅280万H800 GPU小时训练了其671B参数模型——只是同类模型的一小部分——这主要归功于这一优化和其他工程优化。</p>
</li>
</ul>
<h2 id="colab-notebook">编程练习(使用 CoLab 或 notebook<a class="headerlink" href="#colab-notebook" title="Permanent link">&para;</a></h2>
<ol>
<li>
<p>从头实现一个简单的检索增强生成管线。使用TF-IDF(文件02)索引一组文档,为查询检索最相关的段落,并将其前置到提示中。
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="kn">import</span><span class="w"> </span><span class="nn">jax.numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">jnp</span>
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a><span class="kn">import</span><span class="w"> </span><span class="nn">math</span>
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="kn">from</span><span class="w"> </span><span class="nn">collections</span><span class="w"> </span><span class="kn">import</span> <span class="n">Counter</span>
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="c1"># 知识库:一组简短段落</span>
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="n">knowledge_base</span> <span class="o">=</span> <span class="p">[</span>
<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a> <span class="s2">&quot;The Eiffel Tower is a wrought-iron lattice tower in Paris, France. It was constructed from 1887 to 1889 as the centerpiece of the 1889 World&#39;s Fair.&quot;</span><span class="p">,</span>
<a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a> <span class="s2">&quot;The Great Wall of China is a series of fortifications built along the northern borders of China. Construction began in the 7th century BC.&quot;</span><span class="p">,</span>
<a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a> <span class="s2">&quot;Photosynthesis is the process by which plants convert sunlight, water, and carbon dioxide into glucose and oxygen using chlorophyll.&quot;</span><span class="p">,</span>
<a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a> <span class="s2">&quot;The theory of general relativity, published by Albert Einstein in 1915, describes gravity as the curvature of spacetime caused by mass and energy.&quot;</span><span class="p">,</span>
<a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a> <span class="s2">&quot;Python is a high-level programming language known for its simple syntax and readability. It was created by Guido van Rossum and released in 1991.&quot;</span><span class="p">,</span>
<a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a> <span class="s2">&quot;The mitochondria are organelles found in eukaryotic cells. They generate most of the cell&#39;s supply of ATP, used as a source of chemical energy.&quot;</span><span class="p">,</span>
<a id="__codelineno-0-13" name="__codelineno-0-13" href="#__codelineno-0-13"></a><span class="p">]</span>
<a id="__codelineno-0-14" name="__codelineno-0-14" href="#__codelineno-0-14"></a>
<a id="__codelineno-0-15" name="__codelineno-0-15" href="#__codelineno-0-15"></a><span class="c1"># 构建 TF-IDF 索引(重用了文件02中的概念)</span>
<a id="__codelineno-0-16" name="__codelineno-0-16" href="#__codelineno-0-16"></a><span class="k">def</span><span class="w"> </span><span class="nf">tokenise</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
<a id="__codelineno-0-17" name="__codelineno-0-17" href="#__codelineno-0-17"></a> <span class="k">return</span> <span class="n">text</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
<a id="__codelineno-0-18" name="__codelineno-0-18" href="#__codelineno-0-18"></a>
<a id="__codelineno-0-19" name="__codelineno-0-19" href="#__codelineno-0-19"></a><span class="n">vocab</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">w</span> <span class="k">for</span> <span class="n">doc</span> <span class="ow">in</span> <span class="n">knowledge_base</span> <span class="k">for</span> <span class="n">w</span> <span class="ow">in</span> <span class="n">tokenise</span><span class="p">(</span><span class="n">doc</span><span class="p">)))</span>
<a id="__codelineno-0-20" name="__codelineno-0-20" href="#__codelineno-0-20"></a><span class="n">word2idx</span> <span class="o">=</span> <span class="p">{</span><span class="n">w</span><span class="p">:</span> <span class="n">i</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">w</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">vocab</span><span class="p">)}</span>
<a id="__codelineno-0-21" name="__codelineno-0-21" href="#__codelineno-0-21"></a><span class="n">V</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">vocab</span><span class="p">)</span>
<a id="__codelineno-0-22" name="__codelineno-0-22" href="#__codelineno-0-22"></a><span class="n">N</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">knowledge_base</span><span class="p">)</span>
<a id="__codelineno-0-23" name="__codelineno-0-23" href="#__codelineno-0-23"></a>
<a id="__codelineno-0-24" name="__codelineno-0-24" href="#__codelineno-0-24"></a><span class="c1"># 文档频率</span>
<a id="__codelineno-0-25" name="__codelineno-0-25" href="#__codelineno-0-25"></a><span class="n">doc_freq</span> <span class="o">=</span> <span class="n">Counter</span><span class="p">()</span>
<a id="__codelineno-0-26" name="__codelineno-0-26" href="#__codelineno-0-26"></a><span class="k">for</span> <span class="n">doc</span> <span class="ow">in</span> <span class="n">knowledge_base</span><span class="p">:</span>
<a id="__codelineno-0-27" name="__codelineno-0-27" href="#__codelineno-0-27"></a> <span class="k">for</span> <span class="n">w</span> <span class="ow">in</span> <span class="nb">set</span><span class="p">(</span><span class="n">tokenise</span><span class="p">(</span><span class="n">doc</span><span class="p">)):</span>
<a id="__codelineno-0-28" name="__codelineno-0-28" href="#__codelineno-0-28"></a> <span class="n">doc_freq</span><span class="p">[</span><span class="n">w</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
<a id="__codelineno-0-29" name="__codelineno-0-29" href="#__codelineno-0-29"></a>
<a id="__codelineno-0-30" name="__codelineno-0-30" href="#__codelineno-0-30"></a><span class="k">def</span><span class="w"> </span><span class="nf">tfidf_vector</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
<a id="__codelineno-0-31" name="__codelineno-0-31" href="#__codelineno-0-31"></a> <span class="n">words</span> <span class="o">=</span> <span class="n">tokenise</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<a id="__codelineno-0-32" name="__codelineno-0-32" href="#__codelineno-0-32"></a> <span class="n">counts</span> <span class="o">=</span> <span class="n">Counter</span><span class="p">(</span><span class="n">words</span><span class="p">)</span>
<a id="__codelineno-0-33" name="__codelineno-0-33" href="#__codelineno-0-33"></a> <span class="n">vec</span> <span class="o">=</span> <span class="n">jnp</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">V</span><span class="p">)</span>
<a id="__codelineno-0-34" name="__codelineno-0-34" href="#__codelineno-0-34"></a> <span class="k">for</span> <span class="n">w</span><span class="p">,</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">counts</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<a id="__codelineno-0-35" name="__codelineno-0-35" href="#__codelineno-0-35"></a> <span class="k">if</span> <span class="n">w</span> <span class="ow">in</span> <span class="n">word2idx</span><span class="p">:</span>
<a id="__codelineno-0-36" name="__codelineno-0-36" href="#__codelineno-0-36"></a> <span class="n">tf</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">+</span> <span class="n">math</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
<a id="__codelineno-0-37" name="__codelineno-0-37" href="#__codelineno-0-37"></a> <span class="n">idf</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="n">N</span> <span class="o">/</span> <span class="p">(</span><span class="n">doc_freq</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))</span>
<a id="__codelineno-0-38" name="__codelineno-0-38" href="#__codelineno-0-38"></a> <span class="n">vec</span> <span class="o">=</span> <span class="n">vec</span><span class="o">.</span><span class="n">at</span><span class="p">[</span><span class="n">word2idx</span><span class="p">[</span><span class="n">w</span><span class="p">]]</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">tf</span> <span class="o">*</span> <span class="n">idf</span><span class="p">)</span>
<a id="__codelineno-0-39" name="__codelineno-0-39" href="#__codelineno-0-39"></a> <span class="k">return</span> <span class="n">vec</span>
<a id="__codelineno-0-40" name="__codelineno-0-40" href="#__codelineno-0-40"></a>
<a id="__codelineno-0-41" name="__codelineno-0-41" href="#__codelineno-0-41"></a><span class="c1"># 索引所有文档</span>
<a id="__codelineno-0-42" name="__codelineno-0-42" href="#__codelineno-0-42"></a><span class="n">doc_vectors</span> <span class="o">=</span> <span class="n">jnp</span><span class="o">.</span><span class="n">stack</span><span class="p">([</span><span class="n">tfidf_vector</span><span class="p">(</span><span class="n">doc</span><span class="p">)</span> <span class="k">for</span> <span class="n">doc</span> <span class="ow">in</span> <span class="n">knowledge_base</span><span class="p">])</span>
<a id="__codelineno-0-43" name="__codelineno-0-43" href="#__codelineno-0-43"></a>
<a id="__codelineno-0-44" name="__codelineno-0-44" href="#__codelineno-0-44"></a><span class="k">def</span><span class="w"> </span><span class="nf">cosine_sim</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<a id="__codelineno-0-45" name="__codelineno-0-45" href="#__codelineno-0-45"></a> <span class="k">return</span> <span class="n">jnp</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">jnp</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">norm</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">*</span> <span class="n">jnp</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">norm</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="o">+</span> <span class="mf">1e-8</span><span class="p">)</span>
<a id="__codelineno-0-46" name="__codelineno-0-46" href="#__codelineno-0-46"></a>
<a id="__codelineno-0-47" name="__codelineno-0-47" href="#__codelineno-0-47"></a><span class="k">def</span><span class="w"> </span><span class="nf">retrieve</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">top_k</span><span class="o">=</span><span class="mi">2</span><span class="p">):</span>
<a id="__codelineno-0-48" name="__codelineno-0-48" href="#__codelineno-0-48"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;为查询检索top-k个最相关的段落。&quot;&quot;&quot;</span>
<a id="__codelineno-0-49" name="__codelineno-0-49" href="#__codelineno-0-49"></a> <span class="n">q_vec</span> <span class="o">=</span> <span class="n">tfidf_vector</span><span class="p">(</span><span class="n">query</span><span class="p">)</span>
<a id="__codelineno-0-50" name="__codelineno-0-50" href="#__codelineno-0-50"></a> <span class="n">sims</span> <span class="o">=</span> <span class="n">jnp</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="n">cosine_sim</span><span class="p">(</span><span class="n">q_vec</span><span class="p">,</span> <span class="n">doc_vectors</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N</span><span class="p">)])</span>
<a id="__codelineno-0-51" name="__codelineno-0-51" href="#__codelineno-0-51"></a> <span class="n">top_indices</span> <span class="o">=</span> <span class="n">jnp</span><span class="o">.</span><span class="n">argsort</span><span class="p">(</span><span class="o">-</span><span class="n">sims</span><span class="p">)[:</span><span class="n">top_k</span><span class="p">]</span>
<a id="__codelineno-0-52" name="__codelineno-0-52" href="#__codelineno-0-52"></a> <span class="k">return</span> <span class="p">[(</span><span class="nb">int</span><span class="p">(</span><span class="n">i</span><span class="p">),</span> <span class="nb">float</span><span class="p">(</span><span class="n">sims</span><span class="p">[</span><span class="n">i</span><span class="p">]),</span> <span class="n">knowledge_base</span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">i</span><span class="p">)])</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">top_indices</span><span class="p">]</span>
<a id="__codelineno-0-53" name="__codelineno-0-53" href="#__codelineno-0-53"></a>
<a id="__codelineno-0-54" name="__codelineno-0-54" href="#__codelineno-0-54"></a><span class="c1"># 测试检索</span>
<a id="__codelineno-0-55" name="__codelineno-0-55" href="#__codelineno-0-55"></a><span class="n">queries</span> <span class="o">=</span> <span class="p">[</span>
<a id="__codelineno-0-56" name="__codelineno-0-56" href="#__codelineno-0-56"></a> <span class="s2">&quot;Who built the Eiffel Tower?&quot;</span><span class="p">,</span>
<a id="__codelineno-0-57" name="__codelineno-0-57" href="#__codelineno-0-57"></a> <span class="s2">&quot;How do plants make food?&quot;</span><span class="p">,</span>
<a id="__codelineno-0-58" name="__codelineno-0-58" href="#__codelineno-0-58"></a> <span class="s2">&quot;What did Einstein discover?&quot;</span><span class="p">,</span>
<a id="__codelineno-0-59" name="__codelineno-0-59" href="#__codelineno-0-59"></a><span class="p">]</span>
<a id="__codelineno-0-60" name="__codelineno-0-60" href="#__codelineno-0-60"></a>
<a id="__codelineno-0-61" name="__codelineno-0-61" href="#__codelineno-0-61"></a><span class="k">for</span> <span class="n">query</span> <span class="ow">in</span> <span class="n">queries</span><span class="p">:</span>
<a id="__codelineno-0-62" name="__codelineno-0-62" href="#__codelineno-0-62"></a> <span class="n">results</span> <span class="o">=</span> <span class="n">retrieve</span><span class="p">(</span><span class="n">query</span><span class="p">,</span> <span class="n">top_k</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<a id="__codelineno-0-63" name="__codelineno-0-63" href="#__codelineno-0-63"></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Query: &#39;</span><span class="si">{</span><span class="n">query</span><span class="si">}</span><span class="s2">&#39;&quot;</span><span class="p">)</span>
<a id="__codelineno-0-64" name="__codelineno-0-64" href="#__codelineno-0-64"></a> <span class="k">for</span> <span class="n">idx</span><span class="p">,</span> <span class="n">sim</span><span class="p">,</span> <span class="n">passage</span> <span class="ow">in</span> <span class="n">results</span><span class="p">:</span>
<a id="__codelineno-0-65" name="__codelineno-0-65" href="#__codelineno-0-65"></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot; Retrieved (sim=</span><span class="si">{</span><span class="n">sim</span><span class="si">:</span><span class="s2">.3f</span><span class="si">}</span><span class="s2">): &#39;</span><span class="si">{</span><span class="n">passage</span><span class="p">[:</span><span class="mi">80</span><span class="p">]</span><span class="si">}</span><span class="s2">...&#39;&quot;</span><span class="p">)</span>
<a id="__codelineno-0-66" name="__codelineno-0-66" href="#__codelineno-0-66"></a>
<a id="__codelineno-0-67" name="__codelineno-0-67" href="#__codelineno-0-67"></a> <span class="c1"># RAG风格的提示构建</span>
<a id="__codelineno-0-68" name="__codelineno-0-68" href="#__codelineno-0-68"></a> <span class="n">context</span> <span class="o">=</span> <span class="n">results</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span>
<a id="__codelineno-0-69" name="__codelineno-0-69" href="#__codelineno-0-69"></a> <span class="n">rag_prompt</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Context: </span><span class="si">{</span><span class="n">context</span><span class="si">}</span><span class="se">\n\n</span><span class="s2">Question: </span><span class="si">{</span><span class="n">query</span><span class="si">}</span><span class="se">\n</span><span class="s2">Answer:&quot;</span>
<a id="__codelineno-0-70" name="__codelineno-0-70" href="#__codelineno-0-70"></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot; RAG prompt:</span><span class="se">\n</span><span class="s2"> </span><span class="si">{</span><span class="n">rag_prompt</span><span class="p">[:</span><span class="mi">120</span><span class="p">]</span><span class="si">}</span><span class="s2">...&quot;</span><span class="p">)</span>
</code></pre></div></p>
</li>
<li>
<p>使用玩具草稿模型和目标模型实现推测性解码。展示接受的输出与目标模型的分布一致。
<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="kn">import</span><span class="w"> </span><span class="nn">jax</span>
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a><span class="kn">import</span><span class="w"> </span><span class="nn">jax.numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">jnp</span>
<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a>
<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a><span class="c1"># 模拟草稿模型(快速,不太准确)和目标模型(慢速,准确)</span>
<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a><span class="n">vocab_size</span> <span class="o">=</span> <span class="mi">8</span>
<a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a><span class="n">seq_len</span> <span class="o">=</span> <span class="mi">5</span>
<a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a>
<a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a><span class="n">key</span> <span class="o">=</span> <span class="n">jax</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">PRNGKey</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
<a id="__codelineno-1-9" name="__codelineno-1-9" href="#__codelineno-1-9"></a>
<a id="__codelineno-1-10" name="__codelineno-1-10" href="#__codelineno-1-10"></a><span class="c1"># 目标模型:给定序列返回logits</span>
<a id="__codelineno-1-11" name="__codelineno-1-11" href="#__codelineno-1-11"></a><span class="k">def</span><span class="w"> </span><span class="nf">target_model</span><span class="p">(</span><span class="n">seq</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
<a id="__codelineno-1-12" name="__codelineno-1-12" href="#__codelineno-1-12"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;模拟的目标模型:产生token logits(昂贵的)。&quot;&quot;&quot;</span>
<a id="__codelineno-1-13" name="__codelineno-1-13" href="#__codelineno-1-13"></a> <span class="c1"># 实践中这将是一个大型Transformer前向传播</span>
<a id="__codelineno-1-14" name="__codelineno-1-14" href="#__codelineno-1-14"></a> <span class="n">k1</span><span class="p">,</span> <span class="n">k2</span> <span class="o">=</span> <span class="n">jax</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a id="__codelineno-1-15" name="__codelineno-1-15" href="#__codelineno-1-15"></a> <span class="n">logits</span> <span class="o">=</span> <span class="n">jax</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">normal</span><span class="p">(</span><span class="n">k1</span><span class="p">,</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">seq</span><span class="p">),</span> <span class="n">vocab_size</span><span class="p">))</span> <span class="o">*</span> <span class="mi">2</span>
<a id="__codelineno-1-16" name="__codelineno-1-16" href="#__codelineno-1-16"></a> <span class="c1"># 使其有些可预测性:偏向于 token (seq[-1] + 1) % vocab_size</span>
<a id="__codelineno-1-17" name="__codelineno-1-17" href="#__codelineno-1-17"></a> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">seq</span><span class="p">)):</span>
<a id="__codelineno-1-18" name="__codelineno-1-18" href="#__codelineno-1-18"></a> <span class="n">logits</span> <span class="o">=</span> <span class="n">logits</span><span class="o">.</span><span class="n">at</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="p">(</span><span class="n">seq</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="n">vocab_size</span><span class="p">]</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="mf">3.0</span><span class="p">)</span>
<a id="__codelineno-1-19" name="__codelineno-1-19" href="#__codelineno-1-19"></a> <span class="k">return</span> <span class="n">logits</span>
<a id="__codelineno-1-20" name="__codelineno-1-20" href="#__codelineno-1-20"></a>
<a id="__codelineno-1-21" name="__codelineno-1-21" href="#__codelineno-1-21"></a><span class="k">def</span><span class="w"> </span><span class="nf">draft_model</span><span class="p">(</span><span class="n">seq</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
<a id="__codelineno-1-22" name="__codelineno-1-22" href="#__codelineno-1-22"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;模拟的草稿模型:类似但噪声更大(便宜的)。&quot;&quot;&quot;</span>
<a id="__codelineno-1-23" name="__codelineno-1-23" href="#__codelineno-1-23"></a> <span class="n">k1</span><span class="p">,</span> <span class="n">k2</span> <span class="o">=</span> <span class="n">jax</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a id="__codelineno-1-24" name="__codelineno-1-24" href="#__codelineno-1-24"></a> <span class="n">logits</span> <span class="o">=</span> <span class="n">jax</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">normal</span><span class="p">(</span><span class="n">k1</span><span class="p">,</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">seq</span><span class="p">),</span> <span class="n">vocab_size</span><span class="p">))</span>
<a id="__codelineno-1-25" name="__codelineno-1-25" href="#__codelineno-1-25"></a> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">seq</span><span class="p">)):</span>
<a id="__codelineno-1-26" name="__codelineno-1-26" href="#__codelineno-1-26"></a> <span class="n">logits</span> <span class="o">=</span> <span class="n">logits</span><span class="o">.</span><span class="n">at</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="p">(</span><span class="n">seq</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="n">vocab_size</span><span class="p">]</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="mf">2.0</span><span class="p">)</span>
<a id="__codelineno-1-27" name="__codelineno-1-27" href="#__codelineno-1-27"></a> <span class="k">return</span> <span class="n">logits</span>
<a id="__codelineno-1-28" name="__codelineno-1-28" href="#__codelineno-1-28"></a>
<a id="__codelineno-1-29" name="__codelineno-1-29" href="#__codelineno-1-29"></a><span class="k">def</span><span class="w"> </span><span class="nf">sample_token</span><span class="p">(</span><span class="n">logits</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
<a id="__codelineno-1-30" name="__codelineno-1-30" href="#__codelineno-1-30"></a> <span class="k">return</span> <span class="n">jax</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">categorical</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">logits</span><span class="p">)</span>
<a id="__codelineno-1-31" name="__codelineno-1-31" href="#__codelineno-1-31"></a>
<a id="__codelineno-1-32" name="__codelineno-1-32" href="#__codelineno-1-32"></a><span class="k">def</span><span class="w"> </span><span class="nf">speculative_decode</span><span class="p">(</span><span class="n">prefix</span><span class="p">,</span> <span class="n">draft_steps</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">jax</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">PRNGKey</span><span class="p">(</span><span class="mi">0</span><span class="p">)):</span>
<a id="__codelineno-1-33" name="__codelineno-1-33" href="#__codelineno-1-33"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;推测性解码:草稿提出,目标验证。&quot;&quot;&quot;</span>
<a id="__codelineno-1-34" name="__codelineno-1-34" href="#__codelineno-1-34"></a> <span class="n">seq</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">prefix</span><span class="p">)</span>
<a id="__codelineno-1-35" name="__codelineno-1-35" href="#__codelineno-1-35"></a> <span class="n">total_accepted</span> <span class="o">=</span> <span class="mi">0</span>
<a id="__codelineno-1-36" name="__codelineno-1-36" href="#__codelineno-1-36"></a> <span class="n">total_proposed</span> <span class="o">=</span> <span class="mi">0</span>
<a id="__codelineno-1-37" name="__codelineno-1-37" href="#__codelineno-1-37"></a>
<a id="__codelineno-1-38" name="__codelineno-1-38" href="#__codelineno-1-38"></a> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">4</span><span class="p">):</span> <span class="c1"># 生成4轮</span>
<a id="__codelineno-1-39" name="__codelineno-1-39" href="#__codelineno-1-39"></a> <span class="n">key</span><span class="p">,</span> <span class="o">*</span><span class="n">subkeys</span> <span class="o">=</span> <span class="n">jax</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">draft_steps</span> <span class="o">+</span> <span class="mi">3</span><span class="p">)</span>
<a id="__codelineno-1-40" name="__codelineno-1-40" href="#__codelineno-1-40"></a>
<a id="__codelineno-1-41" name="__codelineno-1-41" href="#__codelineno-1-41"></a> <span class="c1"># 草稿模型提出draft_steps个token</span>
<a id="__codelineno-1-42" name="__codelineno-1-42" href="#__codelineno-1-42"></a> <span class="n">draft_tokens</span> <span class="o">=</span> <span class="p">[]</span>
<a id="__codelineno-1-43" name="__codelineno-1-43" href="#__codelineno-1-43"></a> <span class="n">draft_probs</span> <span class="o">=</span> <span class="p">[]</span>
<a id="__codelineno-1-44" name="__codelineno-1-44" href="#__codelineno-1-44"></a> <span class="n">draft_seq</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">seq</span><span class="p">)</span>
<a id="__codelineno-1-45" name="__codelineno-1-45" href="#__codelineno-1-45"></a> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">draft_steps</span><span class="p">):</span>
<a id="__codelineno-1-46" name="__codelineno-1-46" href="#__codelineno-1-46"></a> <span class="n">d_logits</span> <span class="o">=</span> <span class="n">draft_model</span><span class="p">(</span><span class="n">jnp</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">draft_seq</span><span class="p">),</span> <span class="n">subkeys</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
<a id="__codelineno-1-47" name="__codelineno-1-47" href="#__codelineno-1-47"></a> <span class="n">d_probs</span> <span class="o">=</span> <span class="n">jax</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">softmax</span><span class="p">(</span><span class="n">d_logits</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
<a id="__codelineno-1-48" name="__codelineno-1-48" href="#__codelineno-1-48"></a> <span class="n">tok</span> <span class="o">=</span> <span class="n">sample_token</span><span class="p">(</span><span class="n">d_logits</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">subkeys</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
<a id="__codelineno-1-49" name="__codelineno-1-49" href="#__codelineno-1-49"></a> <span class="n">draft_tokens</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">tok</span><span class="p">))</span>
<a id="__codelineno-1-50" name="__codelineno-1-50" href="#__codelineno-1-50"></a> <span class="n">draft_probs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">d_probs</span><span class="p">)</span>
<a id="__codelineno-1-51" name="__codelineno-1-51" href="#__codelineno-1-51"></a> <span class="n">draft_seq</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">tok</span><span class="p">))</span>
<a id="__codelineno-1-52" name="__codelineno-1-52" href="#__codelineno-1-52"></a>
<a id="__codelineno-1-53" name="__codelineno-1-53" href="#__codelineno-1-53"></a> <span class="c1"># 目标模型在一次前向中评估所有草稿token</span>
<a id="__codelineno-1-54" name="__codelineno-1-54" href="#__codelineno-1-54"></a> <span class="n">target_logits</span> <span class="o">=</span> <span class="n">target_model</span><span class="p">(</span><span class="n">jnp</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">draft_seq</span><span class="p">),</span> <span class="n">subkeys</span><span class="p">[</span><span class="n">draft_steps</span><span class="p">])</span>
<a id="__codelineno-1-55" name="__codelineno-1-55" href="#__codelineno-1-55"></a> <span class="n">target_start</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">seq</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span> <span class="c1"># 最后一个前缀token的位置</span>
<a id="__codelineno-1-56" name="__codelineno-1-56" href="#__codelineno-1-56"></a>
<a id="__codelineno-1-57" name="__codelineno-1-57" href="#__codelineno-1-57"></a> <span class="c1"># 接受/拒绝每个草稿token</span>
<a id="__codelineno-1-58" name="__codelineno-1-58" href="#__codelineno-1-58"></a> <span class="n">accepted</span> <span class="o">=</span> <span class="mi">0</span>
<a id="__codelineno-1-59" name="__codelineno-1-59" href="#__codelineno-1-59"></a> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">draft_steps</span><span class="p">):</span>
<a id="__codelineno-1-60" name="__codelineno-1-60" href="#__codelineno-1-60"></a> <span class="n">t_probs</span> <span class="o">=</span> <span class="n">jax</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">softmax</span><span class="p">(</span><span class="n">target_logits</span><span class="p">[</span><span class="n">target_start</span> <span class="o">+</span> <span class="n">i</span><span class="p">])</span>
<a id="__codelineno-1-61" name="__codelineno-1-61" href="#__codelineno-1-61"></a> <span class="n">d_prob</span> <span class="o">=</span> <span class="n">draft_probs</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">draft_tokens</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span>
<a id="__codelineno-1-62" name="__codelineno-1-62" href="#__codelineno-1-62"></a> <span class="n">t_prob</span> <span class="o">=</span> <span class="n">t_probs</span><span class="p">[</span><span class="n">draft_tokens</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span>
<a id="__codelineno-1-63" name="__codelineno-1-63" href="#__codelineno-1-63"></a>
<a id="__codelineno-1-64" name="__codelineno-1-64" href="#__codelineno-1-64"></a> <span class="c1"># 以概率 min(1, target_prob / draft_prob) 接受</span>
<a id="__codelineno-1-65" name="__codelineno-1-65" href="#__codelineno-1-65"></a> <span class="n">accept_prob</span> <span class="o">=</span> <span class="n">jnp</span><span class="o">.</span><span class="n">minimum</span><span class="p">(</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">t_prob</span> <span class="o">/</span> <span class="p">(</span><span class="n">d_prob</span> <span class="o">+</span> <span class="mf">1e-10</span><span class="p">))</span>
<a id="__codelineno-1-66" name="__codelineno-1-66" href="#__codelineno-1-66"></a> <span class="n">key</span><span class="p">,</span> <span class="n">accept_key</span> <span class="o">=</span> <span class="n">jax</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a id="__codelineno-1-67" name="__codelineno-1-67" href="#__codelineno-1-67"></a> <span class="k">if</span> <span class="n">jax</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">uniform</span><span class="p">(</span><span class="n">accept_key</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">accept_prob</span><span class="p">:</span>
<a id="__codelineno-1-68" name="__codelineno-1-68" href="#__codelineno-1-68"></a> <span class="n">seq</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">draft_tokens</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
<a id="__codelineno-1-69" name="__codelineno-1-69" href="#__codelineno-1-69"></a> <span class="n">accepted</span> <span class="o">+=</span> <span class="mi">1</span>
<a id="__codelineno-1-70" name="__codelineno-1-70" href="#__codelineno-1-70"></a> <span class="k">else</span><span class="p">:</span>
<a id="__codelineno-1-71" name="__codelineno-1-71" href="#__codelineno-1-71"></a> <span class="c1"># 拒绝:从调整后的分布中采样</span>
<a id="__codelineno-1-72" name="__codelineno-1-72" href="#__codelineno-1-72"></a> <span class="n">key</span><span class="p">,</span> <span class="n">resample_key</span> <span class="o">=</span> <span class="n">jax</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a id="__codelineno-1-73" name="__codelineno-1-73" href="#__codelineno-1-73"></a> <span class="n">adjusted</span> <span class="o">=</span> <span class="n">jnp</span><span class="o">.</span><span class="n">maximum</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">t_probs</span> <span class="o">-</span> <span class="n">draft_probs</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
<a id="__codelineno-1-74" name="__codelineno-1-74" href="#__codelineno-1-74"></a> <span class="n">adjusted</span> <span class="o">=</span> <span class="n">adjusted</span> <span class="o">/</span> <span class="p">(</span><span class="n">adjusted</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> <span class="o">+</span> <span class="mf">1e-10</span><span class="p">)</span>
<a id="__codelineno-1-75" name="__codelineno-1-75" href="#__codelineno-1-75"></a> <span class="n">new_tok</span> <span class="o">=</span> <span class="n">jax</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">categorical</span><span class="p">(</span><span class="n">resample_key</span><span class="p">,</span> <span class="n">jnp</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="n">adjusted</span> <span class="o">+</span> <span class="mf">1e-10</span><span class="p">))</span>
<a id="__codelineno-1-76" name="__codelineno-1-76" href="#__codelineno-1-76"></a> <span class="n">seq</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">new_tok</span><span class="p">))</span>
<a id="__codelineno-1-77" name="__codelineno-1-77" href="#__codelineno-1-77"></a> <span class="k">break</span>
<a id="__codelineno-1-78" name="__codelineno-1-78" href="#__codelineno-1-78"></a>
<a id="__codelineno-1-79" name="__codelineno-1-79" href="#__codelineno-1-79"></a> <span class="n">total_accepted</span> <span class="o">+=</span> <span class="n">accepted</span>
<a id="__codelineno-1-80" name="__codelineno-1-80" href="#__codelineno-1-80"></a> <span class="n">total_proposed</span> <span class="o">+=</span> <span class="n">draft_steps</span>
<a id="__codelineno-1-81" name="__codelineno-1-81" href="#__codelineno-1-81"></a>
<a id="__codelineno-1-82" name="__codelineno-1-82" href="#__codelineno-1-82"></a> <span class="k">return</span> <span class="n">seq</span><span class="p">,</span> <span class="n">total_accepted</span><span class="p">,</span> <span class="n">total_proposed</span>
<a id="__codelineno-1-83" name="__codelineno-1-83" href="#__codelineno-1-83"></a>
<a id="__codelineno-1-84" name="__codelineno-1-84" href="#__codelineno-1-84"></a><span class="c1"># 运行推测性解码</span>
<a id="__codelineno-1-85" name="__codelineno-1-85" href="#__codelineno-1-85"></a><span class="n">prefix</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">]</span>
<a id="__codelineno-1-86" name="__codelineno-1-86" href="#__codelineno-1-86"></a><span class="n">result_seq</span><span class="p">,</span> <span class="n">accepted</span><span class="p">,</span> <span class="n">proposed</span> <span class="o">=</span> <span class="n">speculative_decode</span><span class="p">(</span><span class="n">prefix</span><span class="p">)</span>
<a id="__codelineno-1-87" name="__codelineno-1-87" href="#__codelineno-1-87"></a><span class="n">acceptance_rate</span> <span class="o">=</span> <span class="n">accepted</span> <span class="o">/</span> <span class="n">proposed</span> <span class="k">if</span> <span class="n">proposed</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="k">else</span> <span class="mi">0</span>
<a id="__codelineno-1-88" name="__codelineno-1-88" href="#__codelineno-1-88"></a>
<a id="__codelineno-1-89" name="__codelineno-1-89" href="#__codelineno-1-89"></a><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Prefix: </span><span class="si">{</span><span class="n">prefix</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<a id="__codelineno-1-90" name="__codelineno-1-90" href="#__codelineno-1-90"></a><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Generated sequence: </span><span class="si">{</span><span class="n">result_seq</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<a id="__codelineno-1-91" name="__codelineno-1-91" href="#__codelineno-1-91"></a><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Draft proposals: </span><span class="si">{</span><span class="n">proposed</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<a id="__codelineno-1-92" name="__codelineno-1-92" href="#__codelineno-1-92"></a><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Accepted: </span><span class="si">{</span><span class="n">accepted</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<a id="__codelineno-1-93" name="__codelineno-1-93" href="#__codelineno-1-93"></a><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Acceptance rate: </span><span class="si">{</span><span class="n">acceptance_rate</span><span class="si">:</span><span class="s2">.1%</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<a id="__codelineno-1-94" name="__codelineno-1-94" href="#__codelineno-1-94"></a><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Speedup potential: </span><span class="si">{</span><span class="p">(</span><span class="n">accepted</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">proposed</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">proposed</span><span class="si">:</span><span class="s2">.2f</span><span class="si">}</span><span class="s2">x&quot;</span><span class="p">)</span>
</code></pre></div></p>
</li>
<li>
<p>构建一个简单的DPO训练循环。给定偏好和不偏好的完成序列对,使用DPO损失更新一个小模型。
<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="kn">import</span><span class="w"> </span><span class="nn">jax</span>
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="kn">import</span><span class="w"> </span><span class="nn">jax.numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">jnp</span>
<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a>
<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a><span class="c1"># 微型语言模型:从one-hot到logits的线性投影</span>
<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a><span class="n">vocab_size</span> <span class="o">=</span> <span class="mi">10</span>
<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a><span class="n">seq_len</span> <span class="o">=</span> <span class="mi">4</span>
<a id="__codelineno-2-7" name="__codelineno-2-7" href="#__codelineno-2-7"></a>
<a id="__codelineno-2-8" name="__codelineno-2-8" href="#__codelineno-2-8"></a><span class="n">key</span> <span class="o">=</span> <span class="n">jax</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">PRNGKey</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
<a id="__codelineno-2-9" name="__codelineno-2-9" href="#__codelineno-2-9"></a><span class="n">k1</span><span class="p">,</span> <span class="n">k2</span> <span class="o">=</span> <span class="n">jax</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a id="__codelineno-2-10" name="__codelineno-2-10" href="#__codelineno-2-10"></a>
<a id="__codelineno-2-11" name="__codelineno-2-11" href="#__codelineno-2-11"></a><span class="c1"># 当前策略参数(可训练的)</span>
<a id="__codelineno-2-12" name="__codelineno-2-12" href="#__codelineno-2-12"></a><span class="n">theta</span> <span class="o">=</span> <span class="n">jax</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">normal</span><span class="p">(</span><span class="n">k1</span><span class="p">,</span> <span class="p">(</span><span class="n">vocab_size</span><span class="p">,</span> <span class="n">vocab_size</span><span class="p">))</span> <span class="o">*</span> <span class="mf">0.1</span>
<a id="__codelineno-2-13" name="__codelineno-2-13" href="#__codelineno-2-13"></a><span class="c1"># 参考策略参数(theta的冻结副本)</span>
<a id="__codelineno-2-14" name="__codelineno-2-14" href="#__codelineno-2-14"></a><span class="n">theta_ref</span> <span class="o">=</span> <span class="n">theta</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<a id="__codelineno-2-15" name="__codelineno-2-15" href="#__codelineno-2-15"></a>
<a id="__codelineno-2-16" name="__codelineno-2-16" href="#__codelineno-2-16"></a><span class="k">def</span><span class="w"> </span><span class="nf">log_prob_sequence</span><span class="p">(</span><span class="n">params</span><span class="p">,</span> <span class="n">sequence</span><span class="p">):</span>
<a id="__codelineno-2-17" name="__codelineno-2-17" href="#__codelineno-2-17"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;计算简单自回归模型下的 log P(sequence)。&quot;&quot;&quot;</span>
<a id="__codelineno-2-18" name="__codelineno-2-18" href="#__codelineno-2-18"></a> <span class="n">total</span> <span class="o">=</span> <span class="mf">0.0</span>
<a id="__codelineno-2-19" name="__codelineno-2-19" href="#__codelineno-2-19"></a> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">sequence</span><span class="p">)):</span>
<a id="__codelineno-2-20" name="__codelineno-2-20" href="#__codelineno-2-20"></a> <span class="c1"># 简单:位置t处的logits取决于位置t-1处的token</span>
<a id="__codelineno-2-21" name="__codelineno-2-21" href="#__codelineno-2-21"></a> <span class="n">logits</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="n">sequence</span><span class="p">[</span><span class="n">t</span><span class="o">-</span><span class="mi">1</span><span class="p">]]</span>
<a id="__codelineno-2-22" name="__codelineno-2-22" href="#__codelineno-2-22"></a> <span class="n">log_probs</span> <span class="o">=</span> <span class="n">jax</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">log_softmax</span><span class="p">(</span><span class="n">logits</span><span class="p">)</span>
<a id="__codelineno-2-23" name="__codelineno-2-23" href="#__codelineno-2-23"></a> <span class="n">total</span> <span class="o">+=</span> <span class="n">log_probs</span><span class="p">[</span><span class="n">sequence</span><span class="p">[</span><span class="n">t</span><span class="p">]]</span>
<a id="__codelineno-2-24" name="__codelineno-2-24" href="#__codelineno-2-24"></a> <span class="k">return</span> <span class="n">total</span>
<a id="__codelineno-2-25" name="__codelineno-2-25" href="#__codelineno-2-25"></a>
<a id="__codelineno-2-26" name="__codelineno-2-26" href="#__codelineno-2-26"></a><span class="k">def</span><span class="w"> </span><span class="nf">dpo_loss</span><span class="p">(</span><span class="n">theta</span><span class="p">,</span> <span class="n">theta_ref</span><span class="p">,</span> <span class="n">preferred</span><span class="p">,</span> <span class="n">dispreferred</span><span class="p">,</span> <span class="n">beta</span><span class="o">=</span><span class="mf">0.1</span><span class="p">):</span>
<a id="__codelineno-2-27" name="__codelineno-2-27" href="#__codelineno-2-27"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;一对数据的直接偏好优化损失。&quot;&quot;&quot;</span>
<a id="__codelineno-2-28" name="__codelineno-2-28" href="#__codelineno-2-28"></a> <span class="n">log_pi_w</span> <span class="o">=</span> <span class="n">log_prob_sequence</span><span class="p">(</span><span class="n">theta</span><span class="p">,</span> <span class="n">preferred</span><span class="p">)</span>
<a id="__codelineno-2-29" name="__codelineno-2-29" href="#__codelineno-2-29"></a> <span class="n">log_pi_l</span> <span class="o">=</span> <span class="n">log_prob_sequence</span><span class="p">(</span><span class="n">theta</span><span class="p">,</span> <span class="n">dispreferred</span><span class="p">)</span>
<a id="__codelineno-2-30" name="__codelineno-2-30" href="#__codelineno-2-30"></a> <span class="n">log_ref_w</span> <span class="o">=</span> <span class="n">log_prob_sequence</span><span class="p">(</span><span class="n">theta_ref</span><span class="p">,</span> <span class="n">preferred</span><span class="p">)</span>
<a id="__codelineno-2-31" name="__codelineno-2-31" href="#__codelineno-2-31"></a> <span class="n">log_ref_l</span> <span class="o">=</span> <span class="n">log_prob_sequence</span><span class="p">(</span><span class="n">theta_ref</span><span class="p">,</span> <span class="n">dispreferred</span><span class="p">)</span>
<a id="__codelineno-2-32" name="__codelineno-2-32" href="#__codelineno-2-32"></a>
<a id="__codelineno-2-33" name="__codelineno-2-33" href="#__codelineno-2-33"></a> <span class="c1"># DPO目标</span>
<a id="__codelineno-2-34" name="__codelineno-2-34" href="#__codelineno-2-34"></a> <span class="k">return</span> <span class="o">-</span><span class="n">jax</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">log_sigmoid</span><span class="p">(</span>
<a id="__codelineno-2-35" name="__codelineno-2-35" href="#__codelineno-2-35"></a> <span class="n">beta</span> <span class="o">*</span> <span class="p">((</span><span class="n">log_pi_w</span> <span class="o">-</span> <span class="n">log_ref_w</span><span class="p">)</span> <span class="o">-</span> <span class="p">(</span><span class="n">log_pi_l</span> <span class="o">-</span> <span class="n">log_ref_l</span><span class="p">))</span>
<a id="__codelineno-2-36" name="__codelineno-2-36" href="#__codelineno-2-36"></a> <span class="p">)</span>
<a id="__codelineno-2-37" name="__codelineno-2-37" href="#__codelineno-2-37"></a>
<a id="__codelineno-2-38" name="__codelineno-2-38" href="#__codelineno-2-38"></a><span class="c1"># 偏好数据集:(提示前缀, 偏好完成序列, 不偏好完成序列)</span>
<a id="__codelineno-2-39" name="__codelineno-2-39" href="#__codelineno-2-39"></a><span class="n">preferences</span> <span class="o">=</span> <span class="p">[</span>
<a id="__codelineno-2-40" name="__codelineno-2-40" href="#__codelineno-2-40"></a> <span class="p">(</span><span class="n">jnp</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">7</span><span class="p">]),</span> <span class="n">jnp</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">2</span><span class="p">])),</span> <span class="c1"># 结尾偏好7而不是2</span>
<a id="__codelineno-2-41" name="__codelineno-2-41" href="#__codelineno-2-41"></a> <span class="p">(</span><span class="n">jnp</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">6</span><span class="p">]),</span> <span class="n">jnp</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">9</span><span class="p">])),</span> <span class="c1"># 偏好6而不是9</span>
<a id="__codelineno-2-42" name="__codelineno-2-42" href="#__codelineno-2-42"></a> <span class="p">(</span><span class="n">jnp</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">]),</span> <span class="n">jnp</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">0</span><span class="p">])),</span> <span class="c1"># 偏好重复而不是0</span>
<a id="__codelineno-2-43" name="__codelineno-2-43" href="#__codelineno-2-43"></a> <span class="p">(</span><span class="n">jnp</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">]),</span> <span class="n">jnp</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">1</span><span class="p">])),</span> <span class="c1"># 偏好8而不是1</span>
<a id="__codelineno-2-44" name="__codelineno-2-44" href="#__codelineno-2-44"></a><span class="p">]</span>
<a id="__codelineno-2-45" name="__codelineno-2-45" href="#__codelineno-2-45"></a>
<a id="__codelineno-2-46" name="__codelineno-2-46" href="#__codelineno-2-46"></a><span class="n">grad_fn</span> <span class="o">=</span> <span class="n">jax</span><span class="o">.</span><span class="n">jit</span><span class="p">(</span><span class="n">jax</span><span class="o">.</span><span class="n">grad</span><span class="p">(</span><span class="n">dpo_loss</span><span class="p">))</span>
<a id="__codelineno-2-47" name="__codelineno-2-47" href="#__codelineno-2-47"></a><span class="n">lr</span> <span class="o">=</span> <span class="mf">0.05</span>
<a id="__codelineno-2-48" name="__codelineno-2-48" href="#__codelineno-2-48"></a>
<a id="__codelineno-2-49" name="__codelineno-2-49" href="#__codelineno-2-49"></a><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;训练 DPO...&quot;</span><span class="p">)</span>
<a id="__codelineno-2-50" name="__codelineno-2-50" href="#__codelineno-2-50"></a><span class="k">for</span> <span class="n">epoch</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">100</span><span class="p">):</span>
<a id="__codelineno-2-51" name="__codelineno-2-51" href="#__codelineno-2-51"></a> <span class="n">total_loss</span> <span class="o">=</span> <span class="mf">0.0</span>
<a id="__codelineno-2-52" name="__codelineno-2-52" href="#__codelineno-2-52"></a> <span class="k">for</span> <span class="n">preferred</span><span class="p">,</span> <span class="n">dispreferred</span> <span class="ow">in</span> <span class="n">preferences</span><span class="p">:</span>
<a id="__codelineno-2-53" name="__codelineno-2-53" href="#__codelineno-2-53"></a> <span class="n">loss</span> <span class="o">=</span> <span class="n">dpo_loss</span><span class="p">(</span><span class="n">theta</span><span class="p">,</span> <span class="n">theta_ref</span><span class="p">,</span> <span class="n">preferred</span><span class="p">,</span> <span class="n">dispreferred</span><span class="p">)</span>
<a id="__codelineno-2-54" name="__codelineno-2-54" href="#__codelineno-2-54"></a> <span class="n">grads</span> <span class="o">=</span> <span class="n">grad_fn</span><span class="p">(</span><span class="n">theta</span><span class="p">,</span> <span class="n">theta_ref</span><span class="p">,</span> <span class="n">preferred</span><span class="p">,</span> <span class="n">dispreferred</span><span class="p">)</span>
<a id="__codelineno-2-55" name="__codelineno-2-55" href="#__codelineno-2-55"></a> <span class="n">theta</span> <span class="o">=</span> <span class="n">theta</span> <span class="o">-</span> <span class="n">lr</span> <span class="o">*</span> <span class="n">grads</span>
<a id="__codelineno-2-56" name="__codelineno-2-56" href="#__codelineno-2-56"></a> <span class="n">total_loss</span> <span class="o">+=</span> <span class="n">loss</span>
<a id="__codelineno-2-57" name="__codelineno-2-57" href="#__codelineno-2-57"></a> <span class="k">if</span> <span class="p">(</span><span class="n">epoch</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="mi">20</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<a id="__codelineno-2-58" name="__codelineno-2-58" href="#__codelineno-2-58"></a> <span class="n">avg_loss</span> <span class="o">=</span> <span class="n">total_loss</span> <span class="o">/</span> <span class="nb">len</span><span class="p">(</span><span class="n">preferences</span><span class="p">)</span>
<a id="__codelineno-2-59" name="__codelineno-2-59" href="#__codelineno-2-59"></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot; Epoch </span><span class="si">{</span><span class="n">epoch</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s2">: avg DPO loss = </span><span class="si">{</span><span class="n">avg_loss</span><span class="si">:</span><span class="s2">.4f</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<a id="__codelineno-2-60" name="__codelineno-2-60" href="#__codelineno-2-60"></a>
<a id="__codelineno-2-61" name="__codelineno-2-61" href="#__codelineno-2-61"></a><span class="c1"># 检查:模型现在应该偏好偏好的完成序列</span>
<a id="__codelineno-2-62" name="__codelineno-2-62" href="#__codelineno-2-62"></a><span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">DPO训练后的偏好检查:&quot;</span><span class="p">)</span>
<a id="__codelineno-2-63" name="__codelineno-2-63" href="#__codelineno-2-63"></a><span class="k">for</span> <span class="n">preferred</span><span class="p">,</span> <span class="n">dispreferred</span> <span class="ow">in</span> <span class="n">preferences</span><span class="p">:</span>
<a id="__codelineno-2-64" name="__codelineno-2-64" href="#__codelineno-2-64"></a> <span class="n">lp_w</span> <span class="o">=</span> <span class="n">log_prob_sequence</span><span class="p">(</span><span class="n">theta</span><span class="p">,</span> <span class="n">preferred</span><span class="p">)</span>
<a id="__codelineno-2-65" name="__codelineno-2-65" href="#__codelineno-2-65"></a> <span class="n">lp_l</span> <span class="o">=</span> <span class="n">log_prob_sequence</span><span class="p">(</span><span class="n">theta</span><span class="p">,</span> <span class="n">dispreferred</span><span class="p">)</span>
<a id="__codelineno-2-66" name="__codelineno-2-66" href="#__codelineno-2-66"></a> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot; Preferred </span><span class="si">{</span><span class="nb">list</span><span class="p">(</span><span class="n">preferred</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="nb">int</span><span class="p">))</span><span class="si">}</span><span class="s2">: logP=</span><span class="si">{</span><span class="n">lp_w</span><span class="si">:</span><span class="s2">.3f</span><span class="si">}</span><span class="s2"> &quot;</span>
<a id="__codelineno-2-67" name="__codelineno-2-67" href="#__codelineno-2-67"></a> <span class="sa">f</span><span class="s2">&quot;Dispreferred </span><span class="si">{</span><span class="nb">list</span><span class="p">(</span><span class="n">dispreferred</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="nb">int</span><span class="p">))</span><span class="si">}</span><span class="s2">: logP=</span><span class="si">{</span><span class="n">lp_l</span><span class="si">:</span><span class="s2">.3f</span><span class="si">}</span><span class="s2"> &quot;</span>
<a id="__codelineno-2-68" name="__codelineno-2-68" href="#__codelineno-2-68"></a> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="s1">&#39;correct&#39;</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">lp_w</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">lp_l</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="s1">&#39;WRONG&#39;</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</code></pre></div></p>
</li>
</ol>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
回到页面顶部
</button>
</main>
<footer class="md-footer">
<nav class="md-footer__inner md-grid" aria-label="页脚" >
<a href="../04.%20transformers%20and%20language%20models/" class="md-footer__link md-footer__link--prev" aria-label="上一页: Transformer 与语言模型">
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</div>
<div class="md-footer__title">
<span class="md-footer__direction">
上一页
</span>
<div class="md-ellipsis">
Transformer 与语言模型
</div>
</div>
</a>
<a href="../../chapter%2008%3A%20computer%20vision/01.%20image%20fundamentals/" class="md-footer__link md-footer__link--next" aria-label="下一页: 图像基础">
<div class="md-footer__title">
<span class="md-footer__direction">
下一页
</span>
<div class="md-ellipsis">
图像基础
</div>
</div>
<div class="md-footer__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
</div>
</a>
</nav>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
<div class="md-social">
<a href="https://github.com/flykhan/maths-cs-ai-compendium-zh" target="_blank" rel="noopener" title="github.com" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "navigation.footer", "search.suggest", "search.highlight", "content.code.copy", "toc.follow"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "\u5df2\u590d\u5236", "clipboard.copy": "\u590d\u5236", "search.result.more.one": "\u5728\u8be5\u9875\u4e0a\u8fd8\u6709 1 \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.more.other": "\u5728\u8be5\u9875\u4e0a\u8fd8\u6709 # \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.none": "\u6ca1\u6709\u627e\u5230\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.one": "\u627e\u5230 1 \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.other": "# \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.placeholder": "\u952e\u5165\u4ee5\u5f00\u59cb\u641c\u7d22", "search.result.term.missing": "\u7f3a\u5c11", "select.version": "\u9009\u62e9\u5f53\u524d\u7248\u672c"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
<script src="../../javascripts/mathjax.js"></script>
<script src="https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js"></script>
</body>
</html>