<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://cswhjiang.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://cswhjiang.github.io/" rel="alternate" type="text/html" hreflang="en" /><updated>2026-06-02T07:57:45+00:00</updated><id>https://cswhjiang.github.io/feed.xml</id><title type="html">Wenhao Jiang’s Homepage</title><subtitle>Wenhao Jiang&apos;s academic homepage, including research interests, selected publications, blog posts, and open positions.</subtitle><author><name>Wenhao Jiang</name><email>cswhjiang@gmail.com</email></author><entry xml:lang="zh-CN"><title type="html">大模型发展展望</title><link href="https://cswhjiang.github.io/2023/04/12/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%8A%80%E6%9C%AF%E5%8F%91%E5%B1%95%E5%B1%95%E6%9C%9B.html" rel="alternate" type="text/html" title="大模型发展展望" /><published>2023-04-12T00:00:00+00:00</published><updated>2023-04-12T00:00:00+00:00</updated><id>https://cswhjiang.github.io/2023/04/12/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%8A%80%E6%9C%AF%E5%8F%91%E5%B1%95%E5%B1%95%E6%9C%9B</id><content type="html" xml:base="https://cswhjiang.github.io/2023/04/12/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%8A%80%E6%9C%AF%E5%8F%91%E5%B1%95%E5%B1%95%E6%9C%9B.html"><![CDATA[<p>从去年年底发布以来，ChatGPT 已经被普通民众和业界广泛接受，可能是用户数量增长最快的消费级应用程序。鉴于ChatGPT的技术价值和商业价值，
国内已经有不少公司复现了ChatGPT，比如百度、阿里、三六零、华为、MiniMax、商汤、复旦大学邱锡鹏团队、元语智能。Meta 开源了650亿参数的LLAMA，
随后有了各种微调的“羊驼”系列。尤其是 deepspeed-chat 的发布，进一步降低了 ChatGPT的复现难度。因此将ChatGPT复现个七七八八的难度看起来不是很大，
发布之后拿到用户prompt可以持续优化，想必可以更接近ChatGPT。</p>

<p>由于ChatGPT可以适用于非常多的任务，很多人认为 AI 已经迎来拐点。李开复将此前的 AI 定义为 AI 1.0，此后的AI定义为AI 2.0。 AI 1.0 中模型适用于单领域，
AI 2.0 中模型普适性增强，一个模型可以适合多种任务和场景。在 AI2.0 中基础的大模型（foundation model）是核心技术。由于有了不少公司发布了类ChatGPT产品以及开源的“羊驼”系列，
当前大众对于ChatGPT的发布已经没有之前那么期待，<strong>ChatGPT 热潮也会过去，但是背后的大模型技术还将继续发展并发挥巨大作用</strong>，
并且会跨越领域/学科，不再局限于CV/NLP/ML，会按照AI独有的特点发展。本文旨在探讨ChatGPT背后的大模型技术以及未来的展望。</p>

<h1 id="大模型-foundation-model简述">大模型 (foundation model)简述</h1>
<p>深度学习领域的研究人员有个愿景，就是用神经网络模拟人脑，让一个神经网络可以完成多种任务。这里面包含至少两层意思：
<strong>一是模型要大，因为人脑的神经元和连接数量规模比较大，远大于存在过的网络模型；二是需要神经网络基本不用微调就可以完成多种任务的能力，
也即是网络要普适。科研上，这两个方面一直有在尝试。</strong> Andrew Ng 的团队在2012年尝试了利用CPU集群增大神经网络参数量[1]，利用无监督的方式来训练了 sparse anto-encoder 网络，优化器采用的是异步SGD，
也采用了模型并行。Andrew Ng 团队发现在训练好的模型中有些神经元具有人脸检测、身体检测、猫脸检测的能力，从模型得到的特征也更好。同年，Geoffrey Hinton 
带领  Alex Krizhevsky 和 Ilya Sutskever 探索使用 GPU 来训练一个 CNN 神经网络（称为AlexNet），训练方式为有监督训练，网络参数为60M，大幅度提高了
ImageNet 数据集上的分类准确率。准确率比第二名高10个点。AlexNet 的成功验证了大量数据 + 深度学习 + GPU训练的价值，这也开启了深度学习的时代
（但是深度学习的起始点一般认为是2006年Hinton那篇用神经网络做维度规约的论文[6]）。 Andrew Ng 和 Geoffrey Hinton 采用的分布式优化、
无监督训练以及GPU训练加速的技术路线后面被继续发扬光大。</p>

<p>AlexNet 之后，TensorFlow、PyTorch 加速了深度学习的发展速度。在深度学习时代网络结构、训练方式、基础设施方面都有了很大的发展。在网络结构方面，
出现了基于注意力的 Transformer 网络，这个网络比较普适，NLP、CV领域都得到了广泛的应用，为大模型提供了统一的模型；在训练方式方面，出现了MLM、MIM、MAE
等等更好的无监督/自监督学习方式，为大模型利用大量数据提供了可能；在基础设施方面，deepspeed[3][4]、Megatron-LM[2] 等也发展成熟，为大模型的有效训练提供了可能。</p>

<p>借助 deepspeed 和 Megatron-LM，后面不少模型借助这些基础设实现了“大”，比如 BERT 等。这些大模型为理解类的大模型，也就是针对分类、emb等任务设计的。
对于这类模型，模型参数多，意味着理解能力更强，performance 更好。由于这类模型不能在任务维度上泛化，一般的使用方式是在大量数据上预训练，然后下游任务数据上微调来使用。
也有些模型往“统一”更多任务/模态的方向努力， 比如 BEiT3、Pix2seq。GAN、Stable Diffusion 系列可以在给定文本描述作为提示词，生成和提示词描述匹配的图像。
但是真正做到在任务维度具备推广能力只有GPT。为了在任务维度上泛化，需要做到让模型感知到不同的任务，并且以期望的形式输出想要的结果。这个可能只有基于 
In-Context Learning (ICL) 的生成式大模型可以做到。 ICL 在GPT-2中使用但是在GPT-3中被定义。在ICL中，和任务有关的信息放在前缀（即context）中，
模型预测给定context之后的期望的输出。基于这个范式，可以将多种任务用同一个形式表达。只需要将期望完成的任务体现在context即可。文生图以及理解类的模型也可以做的很大，
但是执行任务比较单一，本文暂时讨论“大而普适”的模型。</p>

<p>当前 ChatGPT 火的一塌糊涂，让人看到了AGI的曙光，它也拉开了 AI 2.0 的序幕。ChatGPT 的热潮也会过去，但是背后的大模型技术会继续发展，
大模型的能力还是进一步提升，本文展望一下后续技术上的发展展望。</p>

<h1 id="技术上的发展展望">技术上的发展展望</h1>
<p>ChatGPT 当前已经具备非常多的能力，比如摘要、(文档)问答、输出表格、使用工具、理解输入的图像。在很多传统 NLP 任务上表现也很好，比如 parsing、
关键词提取、翻译，也可以非常好的理解人的意图。<strong>ChatGPT 已经成为一个执行自然语言指令的计算机</strong>。有些任务，比如获取日期、符号计算、图像上的物体检测等，
当前 ChatGPT 不太擅长，为了拓展 ChaTGPT 的能力，OpenAI 已经基于GPT搭建基于插件的生态系统。让ChatGPT可以调用插件来完成这些任务。
在此应用场景下（如下图所示），ChatGPT 已经成为大脑，它负责和用户交互，并将用户的任务分解、调用专用API来完成，然后返回结果给用户。
这样人就可以不用直接操作API，可以极大降低人使用AI能力的门槛。这种方式会是未来GPT非常重要的应用形式。
我们以这样的应用方式来讨论这种通用大模型能力可能的发展以及与其他领域结合的展望。</p>

<!--figure tags without plugin: https://stackoverflow.com/questions/19331362/using-an-image-caption-in-markdown-jekyll -->

<figure>
	<a href="/figures/media_future/gpt%E5%BA%94%E7%94%A8%E6%96%B9%E5%BC%8F.png">
		<img src="/figures/media_future/gpt%E5%BA%94%E7%94%A8%E6%96%B9%E5%BC%8F.png" alt="图：gpt应用方式" />
	</a>
<figcaption>
    图：gpt应用方式
</figcaption>
</figure>

<h2 id="gpt-类型大模型自身能力提升">GPT 类型大模型自身能力提升</h2>
<p>对于GPT类型大模型的研究，基本成为一个针对一个新型计算机的研究，包含如何增加新型能力的研究以及一些理论基础的研究等。
基本上是需要提升大模型的“智商”，让它可以更好的执行更多、更高级的任务。总体上，需要提升的能力是能提现“智商”方面的能力，
比如知识、语言、推理、规划、创新等等方面。</p>

<h3 id="gpt-模型的理解和改进">GPT 模型的理解和改进</h3>
<p>对 GPT 的理解包含模型的理解以及使用方式的理解，即 transformer 结构的理解和ICL的理解。</p>

<h4 id="transformer-模型的理解和改进">Transformer 模型的理解和改进</h4>
<p>由于 transformer 本质上已经成为一个执行自然语言任务的计算机，很自然的问题是为什么transformer 可以做到这一点，基于transformer的 ICL 本质上是在做什么。</p>

<p>在[13]中，deepmind提供了一个工具 Tracr，可以将用RASP代码翻译成 transformer 模型的权重，方便从简单算法开始分析 transformer 
如何实现这些算法。[15]中通过构造证明了 looped transformer可以执行迭代算法。将输入划分成 scratchpad、memory 和 instruction 
可以帮组理解输入token在transformer这个自然语言计算机中的作用。对于 GPT 中 transformer 的结构分析和理解也可以参考[24]，
这是Anthropic公司主导的从 circuits [25] 角度分析 transformer 结构的一系列文章合集。从[7]中我们可以看到，FFN 层可以看做存储了训练过程中的知识。
由于Transformer 有多个层，每层都是先做 self-attention，然后做FFN。因此 Transformer 可以简略地看做如下的过程：</p>
<ul>
  <li>在self-attention子层，每个 token 查看所有token信息，并从其他token吸收有用的信息。</li>
  <li>在FFN子层，每个 token 从存储的知识里面吸收有用的知识</li>
</ul>

<p>因此 Transformer 大概可以看做一个知识/信息的迭代“加工”过程，并且这里的知识/信息是经过网络压缩过的。所以，和真实的计算机体系相比较，如下几个概念可能会比较重要</p>
<ul>
  <li>Transformer中缺少了数据/指令区分：当前模型里面指令和数据没有做区分，也就没有可以调用的子函数等等概念，可能基于 modularity network 的概念探索是值得的。比如是否存在某种regularization，使得网络自动演化出来指令和数据的区分。</li>
  <li>缺少停机概念：当前模型是固定迭代执行L层，有些复杂任务可能需要自适应迭代更多层，从而可以使用更多计算。这种设计可能也值得探索。</li>
  <li>memory太小：初步看起来token相当于memory，FFN层和self-attention层知识类似硬盘。但是当前memory太小导致inference时候缓存空间太小，可能再增加一种memory，扩大可使用的 memory 更适合复杂任务。</li>
</ul>

<h4 id="icl-的理解和改进">ICL 的理解和改进</h4>
<p>利用 ICL， GPT实际上将 meta learning表达成了监督学习。常规 meta learning 的 outer loop 是不同任务，inner loop 是任务的监督学习，
只是是以 next token prediction 形式来统一所有任务的 loss，如下图所示。这一描述在GPT-3论文中提到，并且定义为：</p>
<blockquote>
  <p>… “in-context learning”, using the text input of a pretrained language model as a form of task specification: 
the model is conditioned on a natural language instruction and/or a few demonstrations of the task and is 
then expected to complete further instances of the task simply by predicting what comes next.</p>
</blockquote>

<p>根据context中demonstration sample的数量，可以将ICL可以分成三类： zero-shot ICL、one-shot ICL 和 few-shot ICL</p>

<!--figure tags without plugin: https://stackoverflow.com/questions/19331362/using-an-image-caption-in-markdown-jekyll -->

<figure>
	<a href="/figures/media_future/16812662047491.jpg">
		<img src="/figures/media_future/16812662047491.jpg" alt="图：ICL表示为 meta-learning（图片来源：Language Models are Few-Shot Learners）" />
	</a>
<figcaption>
    图：ICL表示为 meta-learning（图片来源：Language Models are Few-Shot Learners）
</figcaption>
</figure>

<p>基于ICL可以方便的将模型用于多种任务，仅仅是需要将任务需要的信息提供在context中即可。一个令人好奇也比较重要的问题是ICL本质上是在做什么，
它的工作机制是什么。这个问题对于模型结构优化、ICL 范式推广到其他领域有指导意义。</p>

<p>在[11] 中验证了，Transformer 结构的模型当以ICL的方式训练，可以发现标准的线性回归算法。也就是在ICL中提供几个样本，训练好的 Transformer 
就可以输出和用这几个样本训练得到的线性回归模型来预测相近的结果，也就是在不需要重新训练 Transformer 的前提下，可以直接输出期望的结果。
在[16] 中证明了，在一些合理的简化和假设前提下，基于demonstrations 的 ICL 基本可以看做一个 meta optimization 过程，
也就是仅仅利用神经网络的前向过程就可以实现对神经网络已有参数上的梯度下降。[11] 和 [16] 都是基于 ICL 中有 demonstration 样本来做的探索。
没有 demonstration 的ICL 可能是利用FFN层存储的信息来执行类似有 demonstration 的操作。</p>

<p>ICL 的机制理解，尤其是无 demonstration 样本的工作机制理解对于提升设计更好的prompt以及模型结构优化有帮助。可能需要考虑如何针对ICL优化是 
Transformer 模型结构优化的一个可能的切入点。
一些比较有趣的问题列举如下：</p>
<ul>
  <li>基于ICL范式的智能上限是什么？ICL性能影响因素是设么？基于ICL的数字推理在发展，但是好像基于ICL的规划，比如下棋、策略、游戏，好像没有公开的文章讨论。
是否可以在给GPT游戏规则描述之后，让GPT学会玩游戏？感觉可以从文字类游戏开始探索。</li>
  <li>除了ICL，执行多任务是否有其他范式？</li>
</ul>

<h3 id="涌现能力的理解和探索">涌现能力的理解和探索</h3>
<p>涌现能力是指随着模型的参数量增大，有些能力突然出现的现象[8]。大模型有些任务指标是可以利用 scaling law 从小模型的训练结果来预测，
比如 ppl。但是有些任务不可以用 scaling law 来预测。当前发现的涌现能力可以参考如下的表格。另外，[33]中总结了137个涌现能力。
由于有涌现现象的存在，有时候利用小模型来预测大模型的性能是有问题的。</p>

<!--figure tags without plugin: https://stackoverflow.com/questions/19331362/using-an-image-caption-in-markdown-jekyll -->

<figure>
	<a href="/figures/media_future/emergent_abilities.jpg">
		<img src="/figures/media_future/emergent_abilities.jpg" alt=" 图：涌现能力举例（图片来源：Emergent Abilities of Large Language Models）" />
	</a>
<figcaption>
     图：涌现能力举例（图片来源：Emergent Abilities of Large Language Models）
</figcaption>
</figure>

<p>智能涌现的原因暂时还没有得到完美的解释。但是可以借鉴在简单问题上的分析来理解涌现能力。
比如，[9]中分析了小模型上模加（modular addition）任务上出现的顿悟能力。
在这个任务上，训练过程中测试误差在训练过程中会突然下降，也就是泛化能力突然增强，看起来像是神经网络“顿悟”了。</p>

<!--figure tags without plugin: https://stackoverflow.com/questions/19331362/using-an-image-caption-in-markdown-jekyll -->

<figure>
	<a href="/figures/media_future/16812669902086.jpg">
		<img src="/figures/media_future/16812669902086.jpg" alt=" 图：顿悟现象：训练过程先是过拟合，然后泛化，看起来是模型突然“顿悟”了。（图片来自：Progress measures for grokking via mechanistic interpretability）" />
	</a>
<figcaption>
     图：顿悟现象：训练过程先是过拟合，然后泛化，看起来是模型突然“顿悟”了。（图片来自：Progress measures for grokking via mechanistic interpretability）
</figcaption>
</figure>

<p>为了解释这种现象，作者基于逆向实验分析将训练大概分成3个阶段，分别是 <strong>memorization, circuit formation, and cleanup</strong>。
在 memorization 阶段神经网络主要是记住训练的样本，在 circuit formation 阶段神经网络主要是形成一些有用的子结构，这些子结构可以提升泛化性能，
在 cleanup 阶段主要是清理到记忆的训练样本。顿悟是发生在 circuit formation 之后。针对大模型的涌现能力，
一个可能的猜想是：有用的子结构需要占用比较多的参数，因此需要在模型规模达到一定程度才能出现。更深入和细致的分析可能会带来模型结构以及训练正则方面的优化，
可能会降低涌现能力需要的最小参数量，让小的模型也具备当前大的模型的能力。</p>

<h3 id="推理规划能力方面的发展">推理、规划能力方面的发展</h3>
<p>GPT 当前已经具备一定的推理能力，推理能力当前还非常依赖 ICL 里面prompt的内容和形式，尤其是依赖CoT。使用方法还是在prompt里面展示几个例子给模型，
激发模型对于这种类型问题知识提取，以帮助解决问题。当前 Google Brain 的 Denny Zhou对于大模型的推理研究比较多，他们提出了 chain of thought、self consistency 等，
也对ICL有一些理论分析。但是 CoT 的存在本身可能说明当前大模型还不太完善。因为训练数据里面有类似CoT的这些例子。
理想一点，模型应该自动“回忆”起来完成这个任务需要的例子，而不是让用户输入。</p>

<p>长远目标可能是让大模型具有推理、规划能力，提升大模型心智能力水平，以使得大模型具备策略类能力。比如为用户自动规划行程（尤其是带有约束条件）、
针对某些问题给出策略、将用户任务分解为插件可以执行的子任务、证明数学定理等，可以极大提升大模型的普适程度。提升推理能力，
专门针对代码问题训练<em>可能</em>会提升大模型的推理能力，但是这个判断的依据并未在论文里面找到。</p>

<p>针对推理能力，有趣问题包括 GPT 模型是否具备产生推理能力的基础、上限在哪里。在 [21][22] 中 Ilya Sutskever 带领团队也尝试利用GPT做定理证明，
基于 GPT 的生成模型结果还算可以，暂时还没有十分惊艳的结果出现，可能原因是定理证明数据偏少，也可能是 GPT 模型自身结构缺乏针对推理的专门设计，
比如探索普适性的 value function。上限的探索可能需要更难的任务，比如棋类。理想一点的目标是 GPT 在给定一个新游戏的规则之后，可以快速学会。</p>

<h3 id="多模态方面的发展展望">多模态方面的发展展望</h3>
<p>大脑是多模态的。多模态可以帮助帮助模型理解更快一点。当前已有的多模态GPT有Flamingo、Kosmos-1等，用GPT生成图像可以参考iGPT[23]。
GPT-4已经可以做到理解输入中的图像。很多人猜想可能未来会支持在输出中增加图像生成的能力。这样模型的输入和输出均为多模态。
这个功能可以利用插件支持，并且需要让GPT模型做到one-step生成高质量图像也需要做很多优化，可能支持起来不是很容易。
收益是支持复杂空间指令等。可以将 GPT生成的图像再用 midjourney 精修。可能在输入端增加对视频/音频的支持性价比更高一点。</p>

<p>当前用一个模型来统一各CV和NLP的各种任务是大的趋势，基本的框架应该还是基于ICL，用命令去控制执行那个任务。在CV领域，可能难点是如何设计自监督学习方法以及 
如何将多种任务统一到 next token prediction 的框架上来。比如Segmentation 任务就不太容易纳入到这个框架中。
当前已经有工作，比如 SegGPT[31] 和 Segmenta Anything[32] 在朝着用ICL来统一的方向演化。
全部任务大一统可能需要一段时间。当前可能会是用ICL逐步统一CV和多模态任务，然后统一到GPT。
但是也需要考虑GPT自身能力和被调用API/插件能力的分界面在哪里。把所有东西都放在GPT里面可能不一定是必要的。</p>

<h3 id="学习编程">学习编程</h3>
<p>代码生成是当前GPT一个比较常见的应用，已有的产品比如copilot，已经可以作为程序员助手。但是
当前用GPT生成code的方法中好像都还没有使用语言的定义、描述解释等。对于机器来说，给这样的信息可能会节省训练数据。
另外，如果可以利用解释器、编译器的反馈，让GPT一直持续学习可能会学会语法。比如把python语言语法定义作为context，
让GPT和python解释器一直交互，让GPT在各种算法问题上训练，可能会生成质量更好的python代码。长远一点的目标可能是让GPT快速学会用常见语言编程解决新问题。</p>

<p>这方面最新的论文是Self-Debug[17]（2023-04-11），来自 Denny Zhou 组。做法是用GPT生成代码的解释，
然后迭代地将代码逐行解释、执行反馈送给model生成代码，直到执行正确。当前暂时没有使用文法，目标暂时是专门的任务，还不够通用。</p>

<!--figure tags without plugin: https://stackoverflow.com/questions/19331362/using-an-image-caption-in-markdown-jekyll -->

<figure>
	<a href="/figures/media_future/16812680758067.jpg">
		<img src="/figures/media_future/16812680758067.jpg" alt=" 图：self-debug。图来自 Teaching Large Language Models to Self-Debug" />
	</a>
<figcaption>
     图：self-debug。图来自 Teaching Large Language Models to Self-Debug
</figcaption>
</figure>

<h3 id="学习使用外部工具">学习使用外部工具</h3>

<p>让GPT学会使用工具已经是业界正在尝试的方法[26,27,28,29]，openai也在建立了以插件为基础的生态。可能也会是未来主要的使用方式。
HuggingGPT[29]利用特殊设计的 prompt 将用户输入的任务分解成已经基于huggingface模型的子任务，以及子任务间的依赖关系。
然后 根据依赖关系执行子任务，并用GPT来综合子任务结果来生成response。TaskMatrix.AI[28]是一个更general的框架，它基于RLHF来对齐GPT和API，
对于API数量没有限制。当前 HuggingGPT 更实用一些。但是未来的应用模式应该是类似TaskMatrix.AI 的模式，因此如何准确地将用户任务分解成子任务的能力未来更重要一些。</p>

<h3 id="gpt-类大模型的安全问题">GPT 类大模型的安全问题</h3>
<p>当前普遍使用的方式是用3H（Helpful, Honest, Harmless）原则来让大模型和人的普世价值对齐。这方面Anthropic发表了不少论文。但是在其他方面也存在安全问题。</p>

<h4 id="指令prompt权限问题">指令/prompt权限问题</h4>
<p>“能力越大，责任越大”，大模型见过的知识可能大于任何一个人，能做出的行为可能也不能做到完全在掌控中。在实际部署的 BING 中，GPT被设置了很多前置prompt，
用于约束大模型行为[30]。比如可以用下图的方法来获取全部的前置prompt（全部泄露的prompt可以访问[30]）。
另外，也会有人尝试覆盖这些前置 prompt，这会导致用户权限提升，引发大模型执行预期之外的行为，比如[40]中列举了一些<strong>提示词注入攻击</strong>。
[41]中也展示了<strong>如何利用越狱提示词来获取用户隐私</strong>。<strong>插件生态也赋予了大模型更多能力，这些能力也是依赖prompt实现。
如果被提升权限，可以利用插件做很多有害的事情。当前基本上还处于裸奔状态</strong>。
当前“如何制作毒品”、“如何制作甲基苯丙胺”这样的问题是可以被识别并拒绝回答，
但是如何通过 prompt 来提升权限绕过已经设置好的限制会是攻击者比较感兴趣的问题。
因此，当前大模型已经基本成为一个执行自然预言指令的计算机的前提下，安全方面的问题也可以借鉴传统计算机里面的安全构架来设计，
比如如何设置指令/prompt权限级别，如何限制用户访问特权指令/prompt等等。这方面暂时还没有看到公开论文。</p>

<!--figure tags without plugin: https://stackoverflow.com/questions/19331362/using-an-image-caption-in-markdown-jekyll -->

<figure>
	<a href="/figures/media_future/new_bing_prompt_leak_1.jpeg">
		<img src="/figures/media_future/new_bing_prompt_leak_1.jpeg" alt=" 图：New Bing中导致prompt泄露的攻击方法。图来自：@kliu128" />
	</a>
<figcaption>
     图：New Bing中导致prompt泄露的攻击方法。图来自：@kliu128
</figcaption>
</figure>

<h4 id="调用方隐私问题">调用方隐私问题</h4>
<p>在员工使用 ChatGPT 的时候非常容易把敏感数据发送到openai的服务器，如果后续用于模型的训练也可能会被其他用户“套”出来。
比如三星数据泄露事件[5]。由于ChatGPT用于交互的信息显著多于搜索，因此使用ChatGPT造成的敏感信息泄露风险也远大于使用搜索引擎。
如何保证用户发送的数据的安全，需要结合密码学协议。针对大模型的场景，猜测<strong>后续可能会出来开放的协议</strong>来保证调用者的数据不被服务提供方记录。</p>

<h2 id="将-icl-用于其他领域">将 ICL 用于其他领域</h2>

<h3 id="决策大模型">决策大模型</h3>
<p>GPT的思路是基于ICL在任务维度上的推广，并且生成是文本。但是实际中，很多场景需要的是决策，也就是面对一个场景做出相应的动作。
在这方面可能理想一点的情况是给大模型描述好任务规则，候选输出的动作，让模型在没有见过的任务上做出好的决策。
这里的难点可能是有些任务规则和达到目标路径也比较复杂，可能需要先在游戏领域内尝试，然后推广到非游戏领域。</p>

<p>Gato[36] 做到了用一个生成式模型来完成多种游戏任务和vision &amp; language 任务。由于context window size 仅仅是1024，
对于新任务 Gato采取的方式是微调。[35] 是大概同时期的工作，也是用transformer来完成多种游戏任务（在41个Atari游戏上训练）。
但是没有显式考虑ICL。AdA[34] 是第一个明确用ICL来让 RL agent 具备快速适应能力(rapid in-context adapataion)的工作。
AdA在XLand 2.0环境中训练，它可以提供 \(10^{40}\) 个任务。因此 AdA 训练的任务非常多，这点类似GPT系列的训练。
在完全没见过的任务上表现比人稍好。当前AdA用的环境和任务还相对实际任务还是比较单一和简单。
在更多复杂任务上训练之后，可能会更强。到时候可能会有<strong>普适的 value 网络</strong>。</p>

<!--figure tags without plugin: https://stackoverflow.com/questions/19331362/using-an-image-caption-in-markdown-jekyll -->

<figure>
	<a href="/figures/media_future/16812685635374.jpg">
		<img src="/figures/media_future/16812685635374.jpg" alt=" 图：AdA中的agent结构。图来自：Human-Timescale Adaptation in an Open-Ended Task Space" />
	</a>
<figcaption>
     图：AdA中的agent结构。图来自：Human-Timescale Adaptation in an Open-Ended Task Space
</figcaption>
</figure>

<h3 id="具身智能">具身智能</h3>
<p>将 GPT和 embodied intelligence 结合并让GPT装进硬件中让GPT可以控制身体执行指令是非常令人向往的尝试。
在这样的场景下，需要GPT<strong>理解多模态输入，理解指令动作之间的关系，需要具备一定planning能力</strong>。
在PaLM-e[38]中，使用常见vision &amp; language 数据以及多个机器人操作任务数据训练模型，机器人具备planning能力。
[39]直接用LLM生成code来控制机器人。在具身智能方面，可能让人激动是可用的人形机器人产品的出现。</p>

<h1 id="结论">结论</h1>
<p>ChatGPT带来了AI模型使用方式的改变，让人可以用自然语言让机器执行各种任务变成现实，为AGI带来了曙光。
ChatGPT 改变了人机交互的方式，大大降低了人使用AI的门槛。后面的人类使用机器的方式也可能会变成人和GPT交互，然后GPT负责和其他机器交互。
AI能力的提升和新的交互方式的出现，也会激发新的应用方式，改变旧的工作流程，从而带来新的业务和新的商业机会。
比如游戏NPC、虚拟人大脑、GPT律师、GPT医生、个人助手等等方面。AI的“文艺复兴”可能真的要来了。</p>

<h1 id="参考文献">参考文献</h1>
<ol>
  <li><a href="https://www.nytimes.com/2012/06/26/technology/in-a-big-network-of-computers-evidence-of-machine-learning.html">How Many Computers to Identify a Cat? 16,000</a></li>
  <li><a href="https://arxiv.org/abs/1909.08053">Megatron-LM: Training Multi-Billion Parameter Language Models Using Model Parallelism.</a></li>
  <li><a href="https://arxiv.org/abs/1910.02054">ZeRO: Memory Optimizations Toward Training Trillion Parameter Models.</a></li>
  <li><a href="https://dl.acm.org/doi/10.1145/3394486.3406703">DeepSpeed: System Optimizations Enable Training Deep Learning Models with Over 100 Billion Parameters.</a></li>
  <li><a href="https://finance.sina.com.cn/tech/csj/2023-04-06/doc-imypmqmf6501481.shtml">三星被曝芯片机密代码遭ChatGPT泄露，引入不到20天就出3起事故，内部考虑重新禁用</a></li>
  <li><a href="https://www.science.org/doi/10.1126/science.1127647">Reducing the Dimensionality of Data with Neural Networks.</a></li>
  <li><a href="https://arxiv.org/abs/2012.14913">Transformer Feed-Forward Layers Are Key-Value Memories.</a></li>
  <li><a href="https://arxiv.org/abs/2206.07682">Emergent Abilities of Large Language Models.</a></li>
  <li><a href="https://arxiv.org/abs/2301.05217">Progress measures for grokking via mechanistic interpretability.</a></li>
  <li><a href="https://arxiv.org/abs/2303.07971">A Theory of Emergent In-Context Learning as Implicit Structure Induction.</a></li>
  <li><a href="https://arxiv.org/abs/2211.15661">What learning algorithm is in-context learning? Investigations with linear models.</a></li>
  <li><a href="https://ai.facebook.com/blog/large-language-model-llama-meta-ai/">Introducing LLaMA: A foundational, 65-billion-parameter large language model.</a></li>
  <li><a href="https://arxiv.org/abs/2301.05062">Tracr: Compiled Transformers as a Laboratory for Interpretability.</a></li>
  <li><a href="https://arxiv.org/abs/2206.10498">Large Language Models Still Can’t Plan.</a></li>
  <li><a href="https://arxiv.org/abs/2301.13196">Looped Transformers as Programmable Computers.</a></li>
  <li><a href="https://arxiv.org/abs/2212.10559">Why Can GPT Learn In-Context? Language Models Secretly Perform Gradient Descent as Meta-Optimizers.</a></li>
  <li><a href="https://arxiv.org/abs/2304.05128">Teaching Large Language Models to Self-Debug.</a></li>
  <li><a href="https://arxiv.org/abs/2301.13867">Mathematical Capabilities of ChatGPT.</a></li>
  <li><a href="https://arxiv.org/abs/2302.03494">A Categorical Archive of ChatGPT Failures.</a></li>
  <li><a href="https://arxiv.org/abs/2303.12712">Sparks of Artificial General Intelligence: Early experiments with GPT-4.</a></li>
  <li><a href="https://arxiv.org/abs/2202.01344">Formal mathematics statement curriculum learning.</a></li>
  <li><a href="https://arxiv.org/abs/2009.03393">Generative language modeling for automated theorem proving.</a></li>
  <li><a href="https://proceedings.mlr.press/v119/chen20s.html">Generative Pretraining from Pixels.</a></li>
  <li><a href="https://transformer-circuits.pub/">Transformer Circuits Thread.</a></li>
  <li><a href="https://distill.pub/2020/circuits/zoom-in/">Zoom In: An Introduction to Circuits</a></li>
  <li><a href="https://arxiv.org/abs/2302.04761">Toolformer: Language Models Can Teach Themselves to Use Tools.</a></li>
  <li><a href="https://arxiv.org/abs/2303.04671">Visual ChatGPT: Talking, Drawing and Editing with Visual Foundation Models.</a></li>
  <li><a href="https://arxiv.org/abs/2303.16434">TaskMatrix.AI: Completing Tasks by Connecting Foundation Models with Millions of APIs.</a></li>
  <li><a href="https://arxiv.org/abs/2303.17580">HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in HuggingFace.</a></li>
  <li><a href="https://twitter.com/kliu128/status/1623472922374574080?lang=en">https://twitter.com/kliu128/status/1623472922374574080?lang=en</a></li>
  <li><a href="https://arxiv.org/abs/2304.03284">SegGPT: Segmenting Everything In Context.</a></li>
  <li><a href="https://arxiv.org/abs/2304.02643">Segment Anything.</a></li>
  <li><a href="https://www.jasonwei.net/blog/emergence">137 emergent abilities of large language models.</a></li>
  <li><a href="https://arxiv.org/abs/2208.10442">Image as a Foreign Language: BEiT Pretraining for All Vision and Vision-Language Tasks.</a></li>
  <li><a href="https://arxiv.org/abs/2205.15241">Multi-Game Decision Transformers.</a></li>
  <li><a href="https://arxiv.org/abs/2205.06175">A generalist agent.</a></li>
  <li><a href="https://arxiv.org/abs/2301.07608">Human-Timescale Adaptation in an Open-Ended Task Space.</a></li>
  <li><a href="https://arxiv.org/abs/2303.03378">PaLM-E: An Embodied Multimodal Language Model.</a></li>
  <li><a href="https://arxiv.org/abs/2209.07753">Code as Policies: Language Model Programs for Embodied Control.</a></li>
  <li><a href="https://simonwillison.net/2023/Apr/14/worst-that-can-happen/">Prompt injection: what’s the worst that can happen?</a></li>
  <li><a href="https://arxiv.org/abs/2304.05197">Multi-step Jailbreaking Privacy Attacks on ChatGPT.</a></li>
</ol>]]></content><author><name>Wenhao Jiang</name><email>cswhjiang@gmail.com</email></author><summary type="html"><![CDATA[从去年年底发布以来，ChatGPT 已经被普通民众和业界广泛接受，可能是用户数量增长最快的消费级应用程序。鉴于ChatGPT的技术价值和商业价值， 国内已经有不少公司复现了ChatGPT，比如百度、阿里、三六零、华为、MiniMax、商汤、复旦大学邱锡鹏团队、元语智能。Meta 开源了650亿参数的LLAMA， 随后有了各种微调的“羊驼”系列。尤其是 deepspeed-chat 的发布，进一步降低了 ChatGPT的复现难度。因此将ChatGPT复现个七七八八的难度看起来不是很大， 发布之后拿到用户prompt可以持续优化，想必可以更接近ChatGPT。]]></summary></entry><entry><title type="html">R-operator in Neural Networks</title><link href="https://cswhjiang.github.io/2015/10/13/Roperator.html" rel="alternate" type="text/html" title="R-operator in Neural Networks" /><published>2015-10-13T00:00:00+00:00</published><updated>2015-10-13T00:00:00+00:00</updated><id>https://cswhjiang.github.io/2015/10/13/Roperator</id><content type="html" xml:base="https://cswhjiang.github.io/2015/10/13/Roperator.html"><![CDATA[<h2 id="what-is-r-operator">What is R-operator?</h2>
<p>The R-operator in neural network is used to compute the product of Hessian matrix \(H\) and a vector \(v\). The time complexity is \(O(n)\), which is lower than ordinary matrix vector product. Because it use back-propagation and does not compute the results directly.</p>

<p>We use \(w\) to denote the parameters and \(g\) to denote gradient vector, and the Hessian matrix could be expressed as \(H = \nabla(g)\). Therefore</p>

\[\begin{align}
\nabla f(w + \Delta w) &amp;= \nabla f(w) + \nabla^2f(w) \Delta w + O(\|\Delta w\|^2) \\
&amp;=\nabla f(w) + H \Delta w + O(\|\Delta w\|^2)
\end{align}\]

<p>If we define \(rv = \Delta w\), we will get</p>

\[Hv = \frac{\nabla f(w + rv) - \nabla f(w)}{r} + O(r)\]

<p>It is an easy way to compute \(Hv\), but it is not stable. Hence R-operator is needed here. The R-operator [1] with respect to \(v\) is defined as</p>

\[R_{v}\{f(w)\} = \frac{\partial{f(w+r v)}}{\partial{r}} \big|_{r=0}\]

<p>Hence \(Hv = R_{v} \{\nabla E(w)\}\). It is obvious that \(R_v\{w\} = v\).
Moreover, R-operator has following properties:</p>

\[\begin{align}
R\{ cf(w)\} &amp;= c R\{ f(w)\} \\
R\{ f(w) + g(w)\} &amp;= R\{ f(w)\} + R\{ g(w)\} \\
R\{f(w)g(w) \} &amp;= R\{f(w) \} g(w) + g(w)R\{ f(w)\} \\
R\{f(g(w))\} &amp;= f'(g(w)) R\{ g(w)\} \\
R\left\{ \frac{d f(w)}{dt} \right\} &amp;= \frac{d R\{f(w)\}}{dt}
\end{align}\]

<p>Our goal is to use the above properties to compute \(R_{v} \{\nabla E(w)\}\), the method used is back-propagation.</p>

<h2 id="how-to-compute-hv-using-r-operator">How to compute \(Hv\) using R-operator</h2>

<h3 id="back-propagation">Back-propagation</h3>

<p>We use the same notations with  <a href="http://deeplearning.stanford.edu/wiki/index.php/Neural_Networks">UFLDL</a> . We denote  \(a^{(l)}\) as the input of the \(l\)-th layer, \(h^{(l+1)}\) as the activation function and \(s_l\) as the number of nodes in layer \(l\). Hence,  \(a^{(1)}\) is the original input \(x\). The forward step of the \(l\)-th layer can be expressed as</p>

\[\begin{align}
z_j^{(l+1)} &amp;= \sum_i w_{ji}^{(l)}a_i^{(l)} + b^{(l)}_j \\
a_j^{(l+1)} &amp;= h^{(l+1)}(z_j^{(l+1)})
\end{align}\]

<p>Except the final layer, the error term \(\delta^{(l)}\) can be computed as</p>

\[\begin{align}
\delta^{(l)}_{i} = {h^{(l)}}'(z^{(l)}_i)\sum_j^{s_{l+1}} w_{ji}^{(l)} \delta^{(l+1)}_{j}
\end{align}\]

<p>For the final layer, the error term is</p>

\[\begin{align}
\delta^{(l+1)}_{i} = \frac{\partial{loss}}{\partial{a^{(l+1)}_i}} {h^{(l+1)}}'(z^{(l+1)}_i)
\end{align}\]

<p>With error terms, we can express the gradient by</p>

\[\begin{align}
\frac{\partial{E}}{\partial{W^{(l)}_{ij}}} &amp;= a^{(l)}_j\delta^{(l+1)}_i \\
\frac{\partial{E}}{\partial{b^{(l)}_{i}}} &amp;= \delta^{(l+1)}_i
\end{align}\]

<h3 id="r-operator">R-operator</h3>

<p>According to the computation of gradients, we have</p>

\[\begin{align}
R_{v}\left\{\frac{\partial{E}} {\partial{W^{(l)}_{ij}}} \right\}&amp;＝R_v \{a^{(l)}_j\delta^{(l+1)}_i \} \\
&amp;= R_v \{a^{(l)}_j \} \delta^{(l+1)}_i + a^{(l)}_j R_v \{\delta^{(l+1)}_i \} \\
R_{v} \left\{\frac{\partial{E}} {\partial{b^{(l)}_{i}}} \right\}&amp;＝ R_v \{\delta^{(l+1)}_i \}
\end{align}\]

<p>For the first layer \(a^{(1)} = x\) and \(R_v \{a^{(l)}_j \} =0\). In order to compute \(Hv\), we need to know \(R_{v}\{a^{(l)}_j \}\)  and \(R_v \{\delta^{(l)}_i \}\). By applying R-operator to the terms in back-propagation, we have</p>

\[\begin{align}
R_v\{z_j^{(l+1)}\} &amp;= R_v\{  \sum_i w_{ji}^{(l)}a_i^{(l)} + b^{(l)}_j \}\\
&amp;= \sum_i  R_v\{w_{ji}^{(l)} \}a_i^{(l)} + \sum_i w_{ji}^{(l)} R_v\{ a_i^{(l)}\}  + R_v\{ b^{(l)}_j \}\\
&amp;= \sum_i v_{ji}^{(l)} a_i^{(l)} + \sum_i w_{ji}^{(l)} R_v\{ a_i^{(l)}\} + v^{(l)}_j\\
R_v\{a_j^{(l+1)}\} &amp;= R_v\{ h^{(l+1)}(z_j^{(l+1)})\}  \\
&amp;= {h^{(l+1)}}'(z_j^{(l+1)}) R_v\{  z_j^{(l+1)}\} \\
R_v\{\delta^{(l)}_i\} &amp;= R_v \left\{ {h^{(l)}}'(z^{(l)}_i)\sum_j^{s_{l+1}} w_{ji}^{(l)} \delta^{(l+1)}_{j} \right\} \\
&amp;= {h^{(l)}}''(z^{(l)}_i) R_v\{z^{(l)}_i\}   \sum_j^{s_{l+1}} w_{ji}^{(l)} \delta^{(l+1)}_{j} \\
&amp; \quad + {h^{(l)}}'(z^{(l)}_i)\sum_j^{s_{l+1}} v_{ji}^{(l)} \delta^{(l+1)}_j  +  {h^{(l)}}'(z^{(l)}_i)\sum_j^{s_{l+1}} w_{ji}^{(l)} R_v \left\{\delta^{(l+1)}_j \right\} 
\end{align}\]

<p>For the final layer, 
\(\begin{align}
&amp; R_{v} \{ \delta^{(l+1)}_{i} \} \\
=&amp; R_{v} \left\{ \frac{\partial{loss}}{\partial{a^{(l+1)}_i}} {h^{(l+1)}}'(z^{(l+1)}_i) \right\} \\
=&amp; \frac{\partial{loss}}{\partial{a^{(l+1)}_i}} R_{v} \left\{ {h^{(l+1)}}'(z^{(l+1)}_i) \right\} + R_{v} \left\{ \frac{\partial{loss}}{\partial{a^{(l+1)}_i}} \right\} {h^{(l+1)}}'(z^{(l+1)}_i) \\
=&amp;  \frac{\partial{loss}}{\partial{a^{(l+1)}_i}} {h^{(l+1)}}''(z^{(l+1)}_i)  R_{v} \left\{ z^{(l+1)}_i \right\} + \frac{\partial^2{loss}}
{  \partial{ a_i^{(l+1)} }^2    } 
R_{v} \left\{   a^{(l+1)}_i   \right\} {h^{(l+1)}}'(z^{(l+1)}_i)
\end{align}\)</p>

<p>This is a general form. There might be no activation function in the last layer. If it is the case, just set \(h''=0, h'=I\).</p>

<p>Therefore, each layer pass \(R_v\{ a^{(l)}\}\) (for the first layer, it is just the zero vector) to the next layer in the forward step, and pass \(R_v\{ \delta^{(l)}\}\) to the previous layer in the backward step. They depend on \(R_v\{ z^{(l)}\}\). Following the above procedure, we can compute \(Hv\), which is similar to the computation of gradient.</p>

<h3 id="example-log-softmax-layer">Example: Log-softmax layer</h3>
<p>It is easy to get the steps for linear layer. Here, we show how to obtain the forward and backward steps of LogSoftMax layer. For the LogSoftMax layer,  the input is denoted as \(z_j\) and the output \(a_i\) is computed by</p>

\[a_i = \log p_i =\log \frac{e^{z_i}}{\sum_j e^{z_j}}\]

<p>Therefore,</p>

\[\begin{align}
R\{a_i\} &amp;= R\left\{\log \frac{e^{z_i}}{\sum_j e^{z_j}}\right\}  \\\\
&amp;= \frac{\sum_j e^{z_j}}{e^{z_i}} R\left\{ \frac{e^{z_i}}{\sum_j e^{z_j}} \right\} \\
R\left\{ \frac{e^{z_i}}{\sum_j e^{z_j}} \right\} &amp;= e^{z_i} R\left\{\frac{1}{\sum_j e^{z_j}} \right\} + R\{e^{z_i}\}\frac{1}{\sum_j e^{z_j}} \\
&amp;= -\frac{e^{z_i}}{\left(\sum_j e^{z_j}\right)^2} R\{\sum_j e^{z_j}\} + e^{z_i} R\{z_i\}\frac{1}{\sum_j e^{z_j}} \\
&amp;=-\frac{e^{z_i}}{\left(\sum_j e^{z_j}\right)^2} \left(\sum_j e^{z_j} R\{z_j\} \right) +  R\{z_i\}\frac{e^{z_i}}{\sum_j e^{z_j}}
\end{align}\]

<p>Hence, we have</p>

\[\begin{align}
R\{a_i\} &amp;=-\frac{1}{ \sum_j e^{z_j} } \left(\sum_j e^{z_j} R\{z_j\} \right) +  R\{z_i\}
\end{align}\]

<p>For the backward step,</p>

\[\delta_i^{(l)} = \sum_j\frac{\partial{a_j}}{\partial{z_i}}\delta_j^{(l+1)}\]

<p>Since we know</p>

\[\begin{align}
\frac{\partial{a_j}}{\partial{z_i}} = -p_i \\
\frac{\partial{a_i}}{\partial{z_i}} = 1-p_i \\
\end{align}\]

<p>and</p>

\[\begin{align}
R\{p_i\} &amp;=R\{ \frac{e^{z_i}}{\sum_j e^{z_j}}\} \\
&amp;=\frac{R\{e^{z_i}\}}{\sum_j e^{z_j}} + e^{z_i} R\{\frac{1}{\sum_j e^{z_j}}\} \\
&amp;=e^{z_i} R\{z_i\} \frac{1}{\sum_j e^{z_j}} -\frac{ e^{z_i}}{(\sum_j e^{z_j})^2} R\{\sum_j e^{z_j}\}  \\
&amp;=e^{z_i} R\{z_i\} \frac{1}{\sum_j e^{z_j}} -\frac{ e^{z_i}}{(\sum_j e^{z_j})^2} \sum_jR\{ e^{z_j}\}  \\
&amp;=e^{z_i} R\{z_i\} \frac{1}{\sum_j e^{z_j}} -\frac{ e^{z_i}}{(\sum_j e^{z_j})^2} \sum_je^{z_j} R\{ z_j\}
\\
&amp;=p_i R\{z_i\}  - p_i \sum_j p_j R\{ z_j\}  \\
\end{align}\]

<p>Finally, we have</p>

\[\begin{align}
&amp; R\{\delta_i^{(l)}\}\\
=&amp;  R\left\{ \sum_j\frac{\partial{a_j}}{\partial{z_i}}\delta_j^{(l+1)} \right\} \\
=&amp; \sum_j R\left\{\frac{\partial{a_j}}{\partial{z_i}}\delta_j^{(l+1)}  \right\} \\
=&amp;\sum_j \left( R\left\{\frac{\partial{a_j}}{\partial{z_i}}  \right\}\delta_j^{(l+1)} + \frac{\partial{a_j}}{\partial{z_i}} R\left\{\delta_j^{(l+1)}  \right\} \right) \\
=&amp;\sum_j \left( -R\{p_i\}\delta_j^{(l+1)} + \frac{\partial{a_j}}{\partial{z_i}} R\left\{\delta_j^{(l+1)}  \right\} \right) \\
=&amp;-R\{p_i\}\sum_j  \delta_j^{(l+1)} + \sum_j \left(\frac{\partial{a_j}}{\partial{z_i}} R\left\{\delta_j^{(l+1)}  \right\} \right) \\
=&amp;-R\{ \frac{e^{z_i}}{\sum_j e^{z_j}}\}\sum_j  \delta_j^{(l+1)} + \sum_j \left(\frac{\partial{a_j}}{\partial{z_i}} R\left\{\delta_j^{(l+1)}  \right\} \right) \\
=&amp;- p_i\left( R\{z_i\}  -  \sum_k p_k R\{ z_k\}\right)\sum_j  \delta_j^{(l+1)} + \sum_j \left(\frac{\partial{a_j}}{\partial{z_i}} R\left\{\delta_j^{(l+1)}  \right\} \right) \\
=&amp; -p_i\left( R\{z_i\}  -  \sum_k p_k R\{ z_k\}\right)\sum_j  \delta_j^{(l+1)} - p_i \sum_j  R\left\{ \delta_j^{(l+1)} \right\} + R\left\{\delta_i^{(l+1)} \right\} 
\end{align}\]

<p>You can find torch implementation in the <code class="language-plaintext highlighter-rouge">rop</code> branch of repository <a href="https://github.com/cswhjiang/nn">nn</a> on my github and example <a href="https://github.com/cswhjiang/nn/blob/rop/doc/rop.md">here</a>.</p>

<h2 id="reference">Reference</h2>
<ol>
  <li>Pearlmutter, Barak A. “Fast exact multiplication by the Hessian.” Neural computation 6.1 (1994): 147-160.</li>
  <li>Bishop, Christopher M. Pattern recognition and machine learning. springer, 2006. (Chapter 5.4.6)</li>
</ol>]]></content><author><name>Wenhao Jiang</name><email>cswhjiang@gmail.com</email></author><summary type="html"><![CDATA[What is R-operator? The R-operator in neural network is used to compute the product of Hessian matrix \(H\) and a vector \(v\). The time complexity is \(O(n)\), which is lower than ordinary matrix vector product. Because it use back-propagation and does not compute the results directly.]]></summary></entry><entry xml:lang="zh-CN"><title type="html">How to escape from saddle points?</title><link href="https://cswhjiang.github.io/2015/09/10/escape-from-saddle-points-copy.html" rel="alternate" type="text/html" title="How to escape from saddle points?" /><published>2015-09-10T00:00:00+00:00</published><updated>2015-09-10T00:00:00+00:00</updated><id>https://cswhjiang.github.io/2015/09/10/escape-from-saddle-points%20copy</id><content type="html" xml:base="https://cswhjiang.github.io/2015/09/10/escape-from-saddle-points-copy.html"><![CDATA[<p>在神经网络尤其是深度神经网络中，鞍点的数量比局部最小值的数量要多很多。鞍点会让 gradient descent 收敛更慢（鞍点附近的梯度太小），甚至会收敛到鞍点。因此如何利用二阶信息来逃离鞍点有必要。然而针对凸问题而设计的牛顿法并不适合这样的场景。牛顿法会被鞍点吸引，牛顿方向甚至不是下降方向，因此不适合 deep learning 的优化。普通的 gradient descent 都会比牛顿法要好。一个比较容易想到的方法是把 Hessian matrix 的负特征值给删掉，仅仅保留正的特征值，但是这种方法不能利用负特征值对应的特征向量的方向。在负的特征值的特征向量对应的下降的方向有可能是下降很快的方向（对于任意的特征向量 \(q\), \(-q\) 也是特征向量，和梯度的内积为负的那个才是下降的方向）。我们的问题是有没有更好的、所有特征向量都能用上的方法。在[2]中作者提出用 absolute Hessian matrix 作为 preconditioning  matrix，absolute Hessian matrix 的定义为</p>

\[|H| = \sum_i |\lambda_i| q_iq_i^T\]

<p>其中 \(\lambda_i\) 和 \(q_i\) 是 Hessian matrix 对应的特征值和特征向量（这种方法不是[2]第一个提出来的）。它的目的是为了使 precondition 之后的 Hessian matrix 的条件数为1。这可能是非凸问题非常好的局部下降方向，但是没有找到证明。这个方法有个直观的理解： \(H\) 是 梯度的变化率，那么 \(H=I\) 说明在局部梯度 \(g\) 仅仅在对应的坐标上有变化（而且变化相同），这样可以用较大的步长（一般需要line search），如果存在一个线性变换使得变换后的函数的 Hessian matrix 为 \(I\)，那么可以在变换后的梯度上用较大的步长（每个component的步长相同），这样的梯度更新等价于在原先的坐标中对梯度应用 preconditioner。这个论述对于凸问题是显然成立的，对于非凸问题其实同样也成立，因为仅仅考虑了 \(f\) 和 \(g\) 的变化率，并没有考虑别的因素。因此对于非凸问题，这个迭代方式很可能是最优的</p>

\[\theta = \theta - \eta |H|^{-1} \nabla f(\theta)\]

<p>我们可以在一个 toy 函数上验证 absolute Hessian matrix 的行为。下图是函数 \(f(x) = x^THx\) （\(H\) 不是正定的）上各种方法的轨迹。可以看出：1)牛顿方向不一定是下降方向，2)牛顿法可以被 saddle points 吸引，3)absolute Hessian matrix 对应的方向有逃离鞍点的作用。因此 absolute Hessian matrix 是个很好的选择。图的代码见<a href="https://gist.github.com/cswhjiang/2281e0476dbb9c3ee999">这里</a>。</p>

<!--figure tags without plugin: https://stackoverflow.com/questions/19331362/using-an-image-caption-in-markdown-jekyll -->

<figure>
	<a href="/figures/2015-09-10-escape-from-saddle-points-a.png">
		<img src="/figures/2015-09-10-escape-from-saddle-points-a.png" alt="图1：不同方向的比较。其中红色是普通的梯度下降、蓝色是牛顿方向，绿色是 absolute Hessian matrix 做 preconditioning  matrix 而找到的方向，紫红色的点是起始点。" />
	</a>
<figcaption>
    图1：不同方向的比较。其中红色是普通的梯度下降、蓝色是牛顿方向，绿色是 absolute Hessian matrix 做 preconditioning  matrix 而找到的方向，紫红色的点是起始点。
</figcaption>
</figure>

<!--figure tags without plugin: https://stackoverflow.com/questions/19331362/using-an-image-caption-in-markdown-jekyll -->

<figure>
	<a href="/figures/2015-09-10-escape-from-saddle-points-b.png">
		<img src="/figures/2015-09-10-escape-from-saddle-points-b.png" alt="图2：不同方向的比较（不同的起始点）。" />
	</a>
<figcaption>
    图2：不同方向的比较（不同的起始点）。
</figcaption>
</figure>

<p>由于计算 absolute Hessian matrix 的复杂度太大，我们仅仅考虑其对角线来近似，同样的近似方法也被用来近似 Hessian matrix（[2]中没有给出近似程度的好坏的证明）。因此我们的目标本来是找</p>

\[D^{-1} = |H|^{-1}\]

<p>但是不好算，因此我们考虑用对角阵</p>

\[D = diag(|H|) = diag(\sqrt{H^2})\]

<p>这个同样不好算。因此[2]中用（\(H^2\)的对角线）</p>

\[D = diag(|H|) \approx \sqrt{diag(H^2)}\]

<p>来近似。这个近似要比 （\(H\)的对角线）</p>

\[D = diag(|H|) \approx \sqrt{diag(H)^2} = |diag(H)|\]

<p>要好一点（这个又叫做 Jacobi preconditioner）。\(\sqrt{diag(H^2)}\)的对角线的元素其实就是 \(H\) 的行向量的模，这就是 [2] 的 title 中 equilibrated 的来源，这个preconditoiner 的本质是对 Hessian matrix 做了个“归一化”。\(H\) 的行向量的模仍然不好算，因此[2] 中用 \(D = \sqrt{E[(Hv)^2]}\) 来近似，其中 \(v\) 是一个高斯分布的随机向量。在 Theano 中可以用 R-operator 来求 \(Hv\)。用这个理论可以部分地解释 Hinton 的 RMSprop。</p>

<h1 id="reference">Reference</h1>
<ol>
  <li>Yann Dauphin, Razvan Pascanu, Caglar Gulcehre, Kyunghyun Cho, Surya Ganguli, Yoshua Bengio. “Identifying and attacking the saddle point problem in high-dimensional non-convex optimization.” Advances in Neural Information Processing Systems. 2014.</li>
  <li>Yann N. Dauphin, Harm de Vries, Yoshua Bengio. “Equilibrated adaptive learning rates for non-convex optimization.” Advances in Neural Information Processing Systems. 2015</li>
</ol>]]></content><author><name>Wenhao Jiang</name><email>cswhjiang@gmail.com</email></author><summary type="html"><![CDATA[在神经网络尤其是深度神经网络中，鞍点的数量比局部最小值的数量要多很多。鞍点会让 gradient descent 收敛更慢（鞍点附近的梯度太小），甚至会收敛到鞍点。因此如何利用二阶信息来逃离鞍点有必要。然而针对凸问题而设计的牛顿法并不适合这样的场景。牛顿法会被鞍点吸引，牛顿方向甚至不是下降方向，因此不适合 deep learning 的优化。普通的 gradient descent 都会比牛顿法要好。一个比较容易想到的方法是把 Hessian matrix 的负特征值给删掉，仅仅保留正的特征值，但是这种方法不能利用负特征值对应的特征向量的方向。在负的特征值的特征向量对应的下降的方向有可能是下降很快的方向（对于任意的特征向量 \(q\), \(-q\) 也是特征向量，和梯度的内积为负的那个才是下降的方向）。我们的问题是有没有更好的、所有特征向量都能用上的方法。在[2]中作者提出用 absolute Hessian matrix 作为 preconditioning matrix，absolute Hessian matrix 的定义为]]></summary></entry><entry xml:lang="zh-CN"><title type="html">Optimization Methods for Large Scale Machine Learning</title><link href="https://cswhjiang.github.io/2015/08/08/large_scale_opt.html" rel="alternate" type="text/html" title="Optimization Methods for Large Scale Machine Learning" /><published>2015-08-08T00:00:00+00:00</published><updated>2015-08-08T00:00:00+00:00</updated><id>https://cswhjiang.github.io/2015/08/08/large_scale_opt</id><content type="html" xml:base="https://cswhjiang.github.io/2015/08/08/large_scale_opt.html"><![CDATA[<p>这是关于机器学习领域的大规模优化的论文列表，为了方便查阅和回忆。 这个列表不一定完整，仅仅包含我认为重要的论文。</p>

<p>在机器学习领域，我们关心的问题表示如下</p>

\[\min_{x} \frac{1}{n} f_i(x) + R(x)\]

<p>其中 \(f(x)\) 通常是光滑的，而  \(R(x)\) 通常不光滑。在这个note中为了方便用 \(f(x)\) 表示 \(\frac{1}{n}\sum_{i}f_i(x)\)。 在机器学习中，这个问题的 \(n\) 和 \(p\) 通常都很大，我们主要关心它的基于梯度的 online learing 和 mini-batch 解法，以及 coordinate descent 方法。 full gradient 的方法通常慢，但是 online 方法的很多新思想是从 full gradient 的方法中来的，因此 full gradient 的方法也会在这个 note 中提到。</p>

<h2 id="2000-之前">2000 之前</h2>

<ul>
  <li>
    <p>Full Gradient (FG) 的方法可以追溯到 Cauchy 1847 年的论文[29]。对于凸函数，FG 的 convergence rate 是 \(O(1/t)\)， 强凸函数可以达到线性收敛 \(O(\rho^t)\)，其中 \(\rho &lt; 1\)。</p>
  </li>
  <li>
    <p>Stochastic Gradient Descent (SGD) 于1951和1952年在文献[15，16]中提出。SGD 随机选择一个 \(f_{i_{t}}\)  来作为梯度的近似 （\(R(x)\equiv 0\) ），然后更新 \(x_t = x_{t-1} - \eta_t \nabla f_{i_t}(x_{t-1})\)。 步长 \(\eta_{t}\) 需要在 步长\(t\) 无穷大的时候趋近于0。 SGD 的 convergence rate 是  \(O(1/\sqrt{t})\)。 [15] 中证明了只要 \(\eta_t\) 满足如下的条件：</p>
  </li>
</ul>

\[\begin{align}
\sum_{t} \eta_t = \infty \  \textrm{and } \ \sum_{t} \eta_t^2 &lt; \infty
\end{align}\]

<p>SGD就可以收敛。SGD 每次迭代的时间和空间的复杂度都是 \(O(d)\).</p>

<ul>
  <li>
    <p>Conjugate Gradient (CG)：共轭梯度是 Magnus Hestenes 和 Eduard Stiefel 在1952年提出的[31]。CG 用来解 \(Ax = b\) 的，不错的材料是 [25]，ML 中不是经常用到。</p>
  </li>
  <li>
    <p>Conditional Gradient Descent （CGD）由 Frank 和 Wolfe 在1956年提出的 [26]， 它用来解一个问题( \(R(x)\equiv 0\))的步骤如下</p>
  </li>
</ul>

\[\begin{align}
y_t  &amp;= argmin_{y \in \mathcal{X}} \nabla f(x_t)^T y \\
x_{t+1} &amp;= (1-\gamma_t) x_t - \gamma_t y_t
\end{align}\]

<p>这个方法的好处是 projection-free、norm-free 以及 sparse iterates。</p>

<ul>
  <li>Proximal Method [23]： Proximal operator 最早由 Moreau 于1960年代提出，本来是作为投影的扩展，[23]中可以找到相关的历史。我们通常用的一般都是 proximal gradient method 来处理带有不光滑项的目标函数， 它可以理解为将光滑的函数 \(f(x)\)二阶近似，只是这个近似的 Hessian 矩阵是 \(\frac{1}{2\eta}I\)， 然后解这个近似的问题，这个问题通常更简单，有的有解析解。它的步骤如下</li>
</ul>

\[x_{t+1} = argmin_{x} \   \nabla f(x_t)^T x  + \frac{1}{2\eta} \|x- x_t\|^2+   R(x)\]

<p>这个步骤也有另一种用 proximal operator 的写法</p>

\[x_{t+1} = prox_{\eta R} (x_t - \eta \nabla f(x_t))\]

<ul>
  <li>L-BFGS 于1980年在文献 [17] 中提出，一开始叫 SQN，在[18]中分析。BFGS 是一种  qusi-Newton 方法， BFGS 用近似的方法来计算 Hessian matrix 的逆。BFGS的原理是要使得二阶近似的导数要和原来的函数相匹配。比如在有了新的 \(x_{t+1}\) 时用到的二次近似 \(m_{t+1}(p) = f(x_{t+1}) + \nabla f(x_{t+1})^T p + \frac{1}{2}p^TB_{t+1} p\)，其中 \(B_{t+1}\) 是 \(\nabla^2 f(x_{t+1})\) 的近似。BFGS要求</li>
</ul>

\[\begin{align}
\nabla m (0) &amp;= \nabla f(x_{t+1}) \\
\nabla m (x_{t} - x_{t+1}) &amp;= \nabla f(x_{t}) \\
\end{align}\]

<p>其中 \(\nabla m\) 是对 \(p\) 的导数。因此 \(B_{t+1} (x_{t+1} - x_t) = \nabla f(x_{t+1}) -\nabla f(x_{t})\) 。就有了 [19] 第八章的迭代算法。 BFGS 的 convergence rata  是 superlinear (Newton  method 是 quadratic )， 每个迭代的复杂度是 \(O(d^2)\)。 LBFGS 不用存一个大的矩阵 \(B\)， 它存前 \(m\)  个迭代的 \(s_t = x_{t+1} - x_{t}\) 和 \(y_t = \nabla f_{t+1} - \nabla f_{t}\), lbfgs 的矩阵 \(B\) 满足 \(B_{t}y_j = s_j\)， \(j = t-1, \cdots, t-m\)。这称为 quasi-Newton equation (rule)。</p>

<ul>
  <li>
    <p>Nesterov’s Accelerated Gradient (NAG) Method：NAG 由 Nesterov 在1983年在文献[30]中提出。简单介绍见以前的<a href="https://cswhjiang.github.io/2015/07/31/nag-and-cm/">blog</a>。</p>
  </li>
  <li>
    <p>Mirror Descent [21]： MD 是由Nemirovsky和Yudin 于1983年在文献 [22] 中提出的。2003年在[21]中被证明和用更一般形式的距离函数的 proximal gradient method 是等价的。它的步骤如下</p>
  </li>
</ul>

\[x_{t+1} = argmin_{x} \ \eta f(x_t)^T x + D_{\Phi} (x, x_t)\]

<p>其中 \(D_{\Phi}\) 是用函数 \(\Phi(x)\) 定义的 Bregman divergence。关于 Mirror descent 总结的很好的材料是<a href="http://users.cecs.anu.edu.au/~xzhang/">张歆华</a>的<a href="http://users.cecs.anu.edu.au/~xzhang/teaching/bregman.pdf">note</a>。这个note的有些结论是来自 [24].</p>

<ul>
  <li>SGD with momentum：1988年 Hinton在文献 [13] 用如下的步骤来求解。</li>
</ul>

\[\begin{align}
\Delta x_t &amp;= \gamma \Delta x_{t-1} - \eta_t \nabla f_{i_{t-1}}(x_{t-1}) \\
x_t &amp;= x_{t-1} + \Delta x_t
\end{align}\]

<p>如果一个维度上的梯度的符号一直变化，那么在这个维度上的更新会被减慢；如果一个维度上的梯度符合很稳定，那么在这个维度上的更新会被加快。 Momentum 最早于1964年在 [20] 中提出。</p>

<ul>
  <li>Averaged SGD [14] 据说由 Ruppert 和 Polyak 在 1980 年代后期独立发明，能找到的引用是 [14]。</li>
</ul>

<h2 id="2000-2010">2000-2010</h2>
<ul>
  <li>Nesterov’s dual averaging，也称为 lazy mirror descent [27]， 这种方法是在 mirror descent 基础上改的： \(\nabla \Phi(y_{t+1}) = \nabla \Phi(y_t) - \eta \nabla f(x_t)\)，因此它省了一个步骤，最终的迭代步骤如下：</li>
</ul>

\[x_{t+1}= argmin_{x} \ \Phi(x)  + \eta \sum_{i}^{t} \nabla f(x_{i})^T x\]

<ul>
  <li>
    <p>Natural gradient [44] 是一种直接求近似的 Fisher information matrix 的逆的 online learning优化算法。</p>
  </li>
  <li>
    <p>Forward-backward splitting （FOBOS） [28] 其实就是 proximal gradient method。</p>
  </li>
  <li>
    <p>FISTA [9] 其实是 proximal gradient method 在当正则项是 \(\ell_1\)-norm的时候的 Nesterov 加速版本，convergence rate 是 \(O(1/t^2)\)</p>
  </li>
  <li>
    <p>sub(L)BFGS [32] 将 (L)BFGS 的应用扩展到非光滑的函数。</p>
  </li>
  <li>
    <p>Regularized dual averging (RDA) [6] 是在2010年由 MSR 的 Lin Xiao 提出的。RDA 是一种改进的 lazy mirror descent 的方法， RDA 的步骤如下：</p>
  </li>
</ul>

\[x_{t+1} = argmin_{x} \   \frac{1}{t}\sum_{j=1}^t \nabla f(x_j)^T x  + R(x)+ \frac{\beta_t}{t}\Phi(x)\]

<ul>
  <li>[37] 提出了 \(\ell_1\)-norm 做正则项的 Stochastic Coordinate Descent （SCD） 解法。最初是在 ICML 2009年会议提出。它将 \(x\) 扩展为 \(\hat{x} = [x, -x]\)，这样问题就变为</li>
</ul>

\[\begin{align}
\min_{w \in R^{2d}} &amp;\ \frac{1}{n} \sum_{i=1}^{n} L(&lt;\hat{x}_i,w&gt;,y_i) + \lambda \sum_{i = 1}^{2d} w_i \\
\textrm{s.t.} &amp; \ w_i \geq 0
\end{align}\]

<p>后来的算法也有采用类似的处理方法。</p>

<ul>
  <li>
    <p>Stochastic Accelerated GradiEnt (SAGE) [39] 是受 Nesterov 的加速方法启发的一种加速方法，它每个步骤维护三个变量（Nesterov加速维护两个）。</p>
  </li>
  <li>
    <p>针对大规模的机器学习问题，[53] 将 test error 分解为 三个部分： approximation error、 estimation error 和 optimization error。因此大规模机器学习是这三个方面的 tradeoff。</p>
  </li>
</ul>

<h2 id="2011">2011</h2>
<ul>
  <li>ADAGRAD [11] 着眼于函数的 condition number， 让每个dimension有不同的 learning rate。更新过程为</li>
</ul>

\[\Delta x_t = -\eta \   diag(G_t)^{-1/2} g_t\]

<p>其中 \(G_t = \sum_i^t g_ig_i^T\)。</p>

<ul>
  <li>
    <p>[38]</p>
  </li>
  <li>
    <p>[48] 是关于 mirror descent 的理论一点的分析。在[48] 中作者证明了只要 mirror map 的函数合适，mirror descent总会有 near-optimal regret，这样的函数一定是存在的，只是没那么容易找到。</p>
  </li>
</ul>

<h2 id="2012">2012</h2>
<ul>
  <li>
    <p>ADADELTA [12] 于2012年提出，是结合了 AdaGrad 和冲量的一种优化方法，所用的技巧是随着迭代指数下降的加权平均。在神经网络中效果不错。</p>
  </li>
  <li>
    <p>Stochastic Average Gradient（SAG）[4,10] 的前提是 \(R(x)\equiv 0\)。采用固定步长的SAG对于convex 函数的 convergence rate 是 \(O(1/t)\)， strongly-convex 的 convergence rate 是线性收敛。SAG 记录历史的梯度，每次的梯度都是更新一个在随机选择的样本处的梯度然后求平均的梯度。作者提供了<a href="http://www.cs.ubc.ca/~schmidtm/Software/SAG.html">代码</a>。</p>
  </li>
  <li>
    <p>[36]</p>
  </li>
  <li>
    <p>feature clustering [35]</p>
  </li>
  <li>
    <p>Optimal Regularized Dual Averaging (ORDA) [49] 采用两种技术：1. 梯度的带权平均，越老的梯度权重越小。2.每次在平均的结果上又前进了一步，和 mirror prox 有点类似。</p>
  </li>
</ul>

<h2 id="2013">2013</h2>
<ul>
  <li>Stochastic Dual Coordinate Ascent (SDCA) [8] 针对的是没有不光滑的正则项的目标函数，原问题定义如下：</li>
</ul>

\[P(w) = \frac{1}{n} \sum_{i=1}^n \phi(w^T x_i) + \frac{\lambda}{2} \|w\|^2\]

<p>它的对偶问题为：</p>

\[D(\alpha) = \frac{1}{n} \sum_{i=1}^n -\phi^*(-\alpha_i) -\frac{\lambda}{2} \|\frac{1}{\lambda n} \sum_{\alpha_i x_i}\|^2\]

<p>用 Stochastic Coordinate Ascent 来解这个对偶问题。</p>

<ul>
  <li>
    <p>Stochastic Variance Reduced Gradient（SVRG） [1]: 一开始提出来的时候还是针对正则项是光滑函数的情况。 SVRG 用在所有数据上重新计算梯度的方法来减小梯度的方差。作者 Rie Johnson 的主页提供<a href="http://riejohnson.com/svrg_download.html">代码</a></p>
  </li>
  <li>
    <p>[5] 是 SVRG 的扩展</p>
  </li>
  <li>
    <p>[40] 中分析了用新的框架分析 SCD 中的 non-uniform sampling 问题，并提出一个最有的对于坐标的采样分布。这篇文章有2015年的journal版。非均匀采样对于 SCD 和 SGD 都是很自然的扩展。</p>
  </li>
  <li>
    <p>Prox-full-gradient [3]: 分析了 proximal gradient method 的加速版本</p>
  </li>
  <li>
    <p>[41] 中分析了对于非光滑的目标函数的 \(\alpha\)-suffix averaging 和 polynomial-decay averaging 影响。</p>
  </li>
  <li>
    <p>leaning rate [45]</p>
  </li>
  <li>
    <p>Stochastic Majorization-minimization [47] 是针对随机MM的优化算法。迭代用的 approximate surrogate  是当前函数和前一个迭代的加权和，可以扩展到非凸的目标函数。</p>
  </li>
</ul>

<h2 id="2014">2014</h2>
<ul>
  <li>
    <p>Prox-SDCA [7]</p>
  </li>
  <li>
    <p>Prox-SVRG [2] 是 SVRG 的扩展，它能处理带有 \(R(x)\) 的问题，以及用了 non-uniform 采样。</p>
  </li>
  <li>
    <p>mini-batch SGD 为了减小 SGD 的梯度的方差以及分布式 SGD 的通信代价，可以用多个样本来求梯度，但是mini-batch 的 size 如果太大会减小 convergence rate。</p>
  </li>
  <li>
    <p>Adaptive moment estimation (Adam) [33]</p>
  </li>
  <li>
    <p>SFO [34]</p>
  </li>
  <li>
    <p>Acc-Prox-SVRG [42] 是一种 mini-batch 的方法，它同时采用 Nesterov 加速和 SVRG 的 varicande reduction 的技术来加速。</p>
  </li>
  <li>
    <p>[46]</p>
  </li>
  <li>
    <p>[51] SAGA</p>
  </li>
  <li>
    <p>[52] batch complexity</p>
  </li>
  <li>
    <p>[54] 把 randomized Kaczmarz 算法看作SGD，分析对样本用非均匀采样的影响。</p>
  </li>
  <li>
    <p>Mini-batch randomized block coordinate descent (MRBCD) [55]  在一个mini-batch 上计算部分的梯度。</p>
  </li>
  <li>
    <p>Adam [58] 是 Adagrad 和 RMSProp 结合起来的一种方法。Adam 有可能是针对 DL 优化当前最好的方法。</p>
  </li>
</ul>

<h2 id="2015">2015</h2>

<ul>
  <li>
    <p>Probabilistic line search [43]：随机梯度下降中的梯度是有噪音的，因此作者 Bayesian Optimization 来解决，是当前方法的一个补充。</p>
  </li>
  <li>
    <p>[50] 作者提出 Fncremental First-order Oracle (IFO) 复杂度框架来分析算法的， IFO 考虑的目标函数是由多个函数的和组成的。</p>
  </li>
  <li>
    <p>Stochastic Dual Newton Ascent (SDNA) [56]</p>
  </li>
  <li>
    <p>Equilibrated SGD [57] 从鞍点对非凸的神经网络的优化的影响的角度解释了 RMSProp 为什么起作用，提出了一个基于 Hessian 矩阵特征值的绝对值的可以逃离鞍点的算法。</p>
  </li>
  <li>
    <p>[59]</p>
  </li>
  <li>
    <p>[60] EASGD</p>
  </li>
</ul>

<h1 id="reference">Reference</h1>
<ol>
  <li>Johnson, Rie, and Tong Zhang. “Accelerating stochastic gradient descent using predictive variance reduction.” Advances in Neural Information Processing Systems. 2013.</li>
  <li>Xiao, Lin, and Tong Zhang. “A proximal stochastic gradient method with progressive variance reduction.” SIAM Journal on Optimization 24.4 (2014): 2057-2075.</li>
  <li>Nesterov, Yu. “Gradient methods for minimizing composite functions.” Mathematical Programming 140.1 (2013): 125-161.</li>
  <li>Roux, Nicolas L., Mark Schmidt, and Francis R. Bach. “A stochastic gradient method with an exponential convergence rate for finite training sets.” Advances in Neural Information Processing Systems. 2012.</li>
  <li>Konečný, Jakub, and Peter Richtárik. “Semi-stochastic gradient descent methods.” arXiv preprint arXiv:1312.1666 (2013).</li>
  <li>Xiao, Lin. “Dual averaging method for regularized stochastic learning and online optimization.” Advances in Neural Information Processing Systems. 2009.</li>
  <li>Shalev-Shwartz, Shai, and Tong Zhang. “Accelerated proximal stochastic dual coordinate ascent for regularized loss minimization.” Mathematical Programming (2014): 1-41.</li>
  <li>Shalev-Shwartz, Shai, and Tong Zhang. “Stochastic dual coordinate ascent methods for regularized loss.” The Journal of Machine Learning Research 14.1 (2013): 567-599.</li>
  <li>Beck, Amir, and Marc Teboulle. “A fast iterative shrinkage-thresholding algorithm for linear inverse problems.” SIAM journal on imaging sciences 2.1 (2009): 183-202.</li>
  <li>Schmidt, Mark, Nicolas Le Roux, and Francis Bach. “Minimizing finite sums with the stochastic average gradient.” arXiv preprint arXiv:1309.2388 (2013).</li>
  <li>Duchi, John, Elad Hazan, and Yoram Singer. “Adaptive subgradient methods for online learning and stochastic optimization.” The Journal of Machine Learning Research 12 (2011): 2121-2159.</li>
  <li>Zeiler, Matthew D. “ADADELTA: An adaptive learning rate method.” arXiv preprint arXiv:1212.5701 (2012).</li>
  <li>Rumelhart, David E., Geoffrey E. Hinton, and Ronald J. Williams. “Learning representations by back-propagating errors.” Cognitive modeling 5 (1988): 3.</li>
  <li>Polyak, Boris T., and Anatoli B. Juditsky. “Acceleration of stochastic approximation by averaging.” SIAM Journal on Control and Optimization 30.4 (1992): 838-855.</li>
  <li>Robbins, Herbert, and Sutton Monro. “A stochastic approximation method.” The annals of mathematical statistics (1951): 400-407.</li>
  <li>Kiefer, Jack, and Jacob Wolfowitz. “Stochastic estimation of the maximum of a regression function.” The Annals of Mathematical Statistics 23.3 (1952): 462-466.</li>
  <li>Nocedal, Jorge. “Updating quasi-Newton matrices with limited storage.” Mathematics of computation 35.151 (1980): 773-782.</li>
  <li>Liu, Dong C., and Jorge Nocedal. “On the limited memory BFGS method for large scale optimization.” Mathematical programming 45.1-3 (1989): 503-528.</li>
  <li>Nocedal, Jorge, and Stephen Wright. Numerical optimization. Springer Science &amp; Business Media, 2006.</li>
  <li>Polyak, Boris Teodorovich. “Some methods of speeding up the convergence of iteration methods.” USSR Computational Mathematics and Mathematical Physics 4.5 (1964): 1-17.</li>
  <li>Beck, Amir, and Marc Teboulle. “Mirror descent and nonlinear projected subgradient methods for convex optimization.” Operations Research Letters 31.3 (2003): 167-175.</li>
  <li>Nemirovsky, Arkadiĭ Semenovich, and David Borisovich Yudin. “Problem complexity and method efficiency in optimization.” (1983).</li>
  <li>Parikh, Neal, and Stephen Boyd. “Proximal algorithms.” Foundations and Trends in optimization 1.3 (2013): 123-231.</li>
  <li>Bubeck, Sébastien. “Theory of convex optimization for machine learning.” arXiv preprint arXiv:1405.4980 (2014).</li>
  <li>Shewchuk, Jonathan Richard. “An introduction to the conjugate gradient method without the agonizing pain.” (1994).</li>
  <li>Frank, Marguerite, and Philip Wolfe. “An algorithm for quadratic programming.” Naval research logistics quarterly 3.1‐2 (1956): 95-110.</li>
  <li>Nesterov, Yurii. “Primal-dual subgradient methods for convex problems.” Mathematical programming 120.1 (2009): 221-259.</li>
  <li>Singer, Yoram, and John C. Duchi. “Efficient learning using forward-backward splitting.” Advances in Neural Information Processing Systems. 2009.</li>
  <li>Cauchy, Augustin. “Méthode générale pour la résolution des systemes d’équations simultanées.” Comp. Rend. Sci. Paris 25.1847 (1847): 536-538.</li>
  <li>Nesterov, Yurii. “A method of solving a convex programming problem with convergence rate O (1/k2).” Soviet Mathematics Doklady. Vol. 27. No. 2. 1983.</li>
  <li>Hestenes, Magnus Rudolph, and Eduard Stiefel. “Methods of conjugate gradients for solving linear systems.” (1952).</li>
  <li>Yu, Jin, et al. “A quasi-Newton approach to non-smooth convex optimization.” Proceedings of the 25th international conference on Machine learning. ACM, 2008.</li>
  <li>Kingma, Diederik, and Jimmy Ba. “Adam: A method for stochastic optimization.” arXiv preprint arXiv:1412.6980 (2014).</li>
  <li>Sohl-dickstein, Jascha, Ben Poole, and Surya Ganguli. “Fast large-scale optimization by unifying stochastic gradient and quasi-Newton methods.” Proceedings of the 31st International Conference on Machine Learning (ICML-14). 2014.</li>
  <li>Scherrer, Chad, et al. “Feature clustering for accelerating parallel coordinate descent.” Advances in Neural Information Processing Systems. 2012.</li>
  <li>Scherrer, Chad, et al. “Scaling Up Coordinate Descent Algorithms for Large $\ ell_1 $ Regularization Problems.” Proceedings of the 29th International Conference on Machine Learning (ICML-12). 2012.</li>
  <li>Shalev-Shwartz, Shai, and Ambuj Tewari. “Stochastic methods for l1-regularized loss minimization.” The Journal of Machine Learning Research 12 (2011): 1865-1892.</li>
  <li>Moulines, Eric, and Francis R. Bach. “Non-asymptotic analysis of stochastic approximation algorithms for machine learning.” Advances in Neural Information Processing Systems. 2011.</li>
  <li>Hu, Chonghai, Weike Pan, and James T. Kwok. “Accelerated gradient methods for stochastic optimization and online learning.” Advances in Neural Information Processing Systems. 2009.</li>
  <li>Richtárik, Peter, and Martin Takáč. “On optimal probabilities in stochastic coordinate descent methods.” arXiv preprint arXiv:1310.3438 (2013).</li>
  <li>Shamir, Ohad, and Tong Zhang. “Stochastic Gradient Descent for Non-smooth Optimization: Convergence Results and Optimal Averaging Schemes.” Proceedings of the 30th International Conference on Machine Learning (ICML-13). 2013.</li>
  <li>Nitanda, Atsushi. “Stochastic proximal gradient descent with acceleration techniques.” Advances in Neural Information Processing Systems. 2014.</li>
  <li>Mahsereci, Maren, and Philipp Hennig. “Probabilistic Line Searches for Stochastic Optimization.” arXiv preprint arXiv:1502.02846 (2015).</li>
  <li>Amari, Shun-Ichi, Hyeyoung Park, and Kenji Fukumizu. “Adaptive method of realizing natural gradient learning for multilayer perceptrons.” Neural Computation 12.6 (2000): 1399-1409.</li>
  <li>Schaul, Tom, Sixin Zhang, and Yann Lecun. “No more pesky learning rates.” Proceedings of the 30th International Conference on Machine Learning (ICML-13). 2013.</li>
  <li>McMahan, Brendan, and Matthew Streeter. “Delay-Tolerant Algorithms for Asynchronous Distributed Online Learning.” Advances in Neural Information Processing Systems. 2014.</li>
  <li>Mairal, Julien. “Stochastic majorization-minimization algorithms for large-scale optimization.” Advances in Neural Information Processing Systems. 2013.</li>
  <li>Srebro, Nati, Karthik Sridharan, and Ambuj Tewari. “On the universality of online mirror descent.” Advances in neural information processing systems. 2011.</li>
  <li>Chen, Xi, Qihang Lin, and Javier Pena. “Optimal regularized dual averaging methods for stochastic optimization.” Advances in Neural Information Processing Systems. 2012.</li>
  <li>Agarwal, Alekh, and Leon Bottou. “A lower bound for the optimization of finite sums.” ICMl 2015.</li>
  <li>Defazio, Aaron, Francis Bach, and Simon Lacoste-Julien. “SAGA: A fast incremental gradient method with support for non-strongly convex composite objectives.” Advances in Neural Information Processing Systems. 2014.</li>
  <li>Zhang, Yuchen, and Lin Xiao. “Stochastic primal-dual coordinate method for regularized empirical risk minimization.” arXiv preprint arXiv:1409.3257 (2014).</li>
  <li>Bousquet, Olivier, and Léon Bottou. “The tradeoffs of large scale learning.” Advances in neural information processing systems. 2008.</li>
  <li>Needell, Deanna, Rachel Ward, and Nati Srebro. “Stochastic gradient descent, weighted sampling, and the randomized Kaczmarz algorithm.” Advances in Neural Information Processing Systems. 2014.</li>
  <li>Zhao, Tuo, et al. “Accelerated Mini-batch Randomized Block Coordinate Descent Method.” Advances in neural information processing systems. 2014.</li>
  <li>Qu, Zheng, et al. “SDNA: Stochastic Dual Newton Ascent for Empirical Risk Minimization.” arXiv preprint arXiv:1502.02268 (2015).</li>
  <li>Dauphin, Yann N., et al. “RMSProp and equilibrated adaptive learning rates for non-convex optimization.” arXiv preprint arXiv:1502.04390 (2015).</li>
  <li>Kingma, Diederik, and Jimmy Ba. “Adam: A method for stochastic optimization.” arXiv preprint arXiv:1412.6980 (2014).</li>
  <li>Reddi, Sashank J., et al. “On Variance Reduction in Stochastic Gradient Descent and its Asynchronous Variants.” arXiv preprint arXiv:1506.06840 (2015).</li>
  <li>Zhang, Sixin, Anna Choromanska, and Yann LeCun. “Deep learning with Elastic Averaging SGD.” arXiv preprint arXiv:1412.6651 (2014).</li>
</ol>]]></content><author><name>Wenhao Jiang</name><email>cswhjiang@gmail.com</email></author><summary type="html"><![CDATA[这是关于机器学习领域的大规模优化的论文列表，为了方便查阅和回忆。 这个列表不一定完整，仅仅包含我认为重要的论文。]]></summary></entry><entry xml:lang="zh-CN"><title type="html">Notes on Mirror Descent</title><link href="https://cswhjiang.github.io/2015/08/07/mirror-descent.html" rel="alternate" type="text/html" title="Notes on Mirror Descent" /><published>2015-08-07T00:00:00+00:00</published><updated>2015-08-07T00:00:00+00:00</updated><id>https://cswhjiang.github.io/2015/08/07/mirror-descent</id><content type="html" xml:base="https://cswhjiang.github.io/2015/08/07/mirror-descent.html"><![CDATA[<p>这是关于 mirror descent 的不严谨的介绍。严谨的推导可以参考文献[2]。</p>

<p>通常做迭代的空间是 Hilber space。但是如果优化变量是在 Banach space \(\mathcal{B}\) 中就没有办法按照以前的步骤来了。这是因为 Banach space 的内积没有定义。这时候需要在其对偶空间 \(\mathcal{B}^*\) 上更新优化变量。对偶空间 \(\mathcal{B}^*\) 是线性函数（从 \(\mathcal{B}\) 到域 \(F\) ）的向量空间。可以参考维基百科的<a href="https://en.wikipedia.org/wiki/Dual_space">定义</a>。目标函数的梯度 \(\nabla f(x)\) 是对偶空间 \(\mathcal{B}^*\) 中的，这时候可以在对偶空间上更新梯度，然后在投影回来就完成了对优化变量的更新。把 \(\mathcal{B}\) 中的元素映射成 \(\mathcal{B}^*\) 中的元素的函数 \(\Phi\) 叫做 mirror map，它是由 \(\mathcal{B}\) 上的一个凸开集到实数 \(R\) 上的一个函数 ，它需要符合以下三个条件：</p>

<ul>
  <li>
    <p>\(\Phi\) 是 strictly convex 以及 differentiable 的。</p>
  </li>
  <li>
    <p>\(\Phi\) 的梯度能取遍所有的 \(\mathbb{R}^n\)。</p>
  </li>
  <li>
    <p>\(\Phi\) 的梯度在其定义域的凸开集的边界上是 diverge 的，也就是 \(\lim_{x \to \partial{\mathcal{D}} } \|\Phi\| = + \infty\)</p>
  </li>
</ul>

<p>通常称 \(\Phi\) 把 primal space 的点投影到 dual space 中 ，其实是把  \(\mathcal{B}\) 中的点 \(x\) 映射成 \(\nabla \Phi(x)\) 。这样我们在 dual space 中更新梯度</p>

\[\nabla \Phi(y) = \nabla \Phi(x) - \eta \nabla f(x)\]

<p>其中 \(y\) 是 primal space 中的点，这样我们就可以在 primal space 中更新优化变量了。当然，\(y\) 可能在目标函数的定义域 \(\mathcal{X}\) 之外，需要在 primal space 上投影回这个定义域，这个投影用的是 Bregman divergence 来做：</p>

\[\Pi_{\mathcal{X}}^{\Phi}(y)= argmin_{x \in \mathcal{X}\cap \mathcal{D} } D_{\Phi}(x,y)\]

<p>其中 \(D_{\Phi}(x,y)\) 是对于函数 \(f\) 的 Bregman divergence， 定义如下</p>

\[D_{f}(x,y) = f(x) - f(y) - \nabla f(y)^T(x-y)\]

<p>它是 \(f(x)\) 跟在 \(y\) 处的一阶近似做差得到的。因此，mirror descent 的步骤总结如下：</p>

\[\begin{align}
\nabla \Phi(y_{t+1}) &amp;= \nabla \Phi(x_t) - \eta \nabla f(x_t) \\
x_{t+1} &amp;=argmin_{x \in \mathcal{X}\cap \mathcal{D} } \ D_{\Phi}(x,y_{t+1})
\end{align}\]

<p>对于上面的这两个步骤可以有如下的另一种表示方法</p>

\[\begin{align}
x_{t+1} &amp;= argmin_{x} \ D_{\Phi}(x,y_{t+1}) \\
&amp;= argmin_{x} \ \Phi(x) - \Phi(y_{t+1}) - \nabla \Phi(y_{t+1})^T(x-y_{t+1}) \\
&amp;= argmin_{x} \ \Phi(x)  - \nabla \Phi(y_{t+1})^T x \\
&amp;= argmin_{x} \ \Phi(x)  -  (\nabla \Phi(x_t) - \eta \nabla f(x_t))^T x \\
&amp;= argmin_{x} \ \Phi(x)  -  \nabla \Phi(x_t)^T x + \eta \nabla f(x_t)^T x \\
&amp;= argmin_{x} \ \eta \nabla f(x_t)^T x + \Phi(x) -\Phi(x_t) -  \nabla \Phi(x_t)^T (x-x_t)   \\
&amp;= argmin_{x} \ \eta \nabla f(x_t)^T x  + D_{\Phi}(x, x_t)
\end{align}\]

<p>最后这一步就是 proximal gradient descent  的迭代步骤了，因此 mirror descent 可以看作更general 的 proximal gradient descent。所有对于 proximal gradient descent 的方法都可以用到 MD 上，并且 MD 还好有个好处就是可以采用更好的 mirror map 函数来加速收敛。</p>

<p>Nesterov 把 MD 更新的第一个步骤改为</p>

\[\nabla \Phi(y_{t+1}) = \nabla \Phi(y_t) - \eta \nabla f(x_t)\]

<p>也就是把 \(\Phi(x_t)\) 改成了 \(\Phi(y_t)\)，这相当于省略了一个投影的步骤，直接在上一次的 \(y_t\) 上继续更新。这称为 lazy mirror descent，也叫做 Nesterov’s dual averaging。所以，这里的 dual 并不是指的目标问题的对偶问题。同样的，根据把 MD 化成 proximal gradient descent  的方法可以得到</p>

\[\begin{align}
x_{t+1} &amp;= argmin_{x} \ D_{\Phi}(x,y_{t+1}) \\
&amp;= argmin_{x} \ \Phi(x) - \Phi(y_{t+1}) - \nabla \Phi(y_{t+1})^T(x-y_{t+1}) \\
&amp;= argmin_{x} \ \Phi(x)  - \nabla \Phi(y_{t+1})^T x \\
&amp;= argmin_{x} \ \Phi(x)  -  (\nabla \Phi(y_t) - \eta \nabla f(x_t))^T x \\
&amp;= argmin_{x} \ \Phi(x)  -  \nabla \Phi(y_t)^T x + \eta \nabla f(x_t)^T x \\
&amp;= argmin_{x} \ \Phi(x)  -  (\nabla \Phi(y_{t-1}) - \eta \nabla f(x_{t-1}))^T x + \eta \nabla f(x_t)^T x \\
&amp;= argmin_{x} \ \Phi(x)  -  \nabla \Phi(y_{t-1})^T x + \eta \nabla f(x_{t-1})^T x + \eta \nabla f(x_t)^T x \\
&amp; \qquad \qquad  \vdots \\
&amp;= argmin_{x} \ \Phi(x)  -  \nabla \Phi(y_{1})^T x + \eta \sum_{i}^{t} \nabla f(x_{i})^T x \\
&amp;= argmin_{x} \ \Phi(x)  + \eta \sum_{i}^{t} \nabla f(x_{i})^T x 
\end{align}\]

<p>这里通常 \(\nabla \Phi(y_{1})=0\)。</p>

<p>MD 和 lazy MD 的 convergence rate 是 \(O(1/\sqrt{t})\)。对于光滑函数可以加速达到 \(O(1/t)\)，下面的 mirror prox 是其中的一种方法：</p>

\[\begin{align}
\nabla \Phi(y_{t+1}') &amp;= \nabla \Phi(x_t) - \eta \nabla f(x_t) \\
y_{t+1} &amp;=argmin_{x \in \mathcal{X}\cap \mathcal{D} } \ D_{\Phi}(x,y_{t+1}')\\
\nabla \Phi(x_{t+1}') &amp;= \nabla \Phi(x_t) - \eta \nabla f(y_{t+1}) \\
x_{t+1} &amp;=argmin_{x \in \mathcal{X}\cap \mathcal{D} } \ D_{\Phi}(x,x_{t+1}')
\end{align}\]

<h1 id="reference">Reference</h1>
<ol>
  <li><a href="http://users.cecs.anu.edu.au/~xzhang/teaching/bregman.pdf">Xinhua Zhang’s notes: Bregman Divergence and Mirror Descent</a></li>
  <li>Bubeck, Sébastien. “Theory of convex optimization for machine learning.” arXiv preprint arXiv:1405.4980 (2014).</li>
</ol>]]></content><author><name>Wenhao Jiang</name><email>cswhjiang@gmail.com</email></author><summary type="html"><![CDATA[这是关于 mirror descent 的不严谨的介绍。严谨的推导可以参考文献[2]。]]></summary></entry><entry xml:lang="zh-CN"><title type="html">Classical Momentum and Nesterov’s Accelerated Gradient Descent</title><link href="https://cswhjiang.github.io/2015/07/31/nag-and-cm.html" rel="alternate" type="text/html" title="Classical Momentum and Nesterov’s Accelerated Gradient Descent" /><published>2015-07-31T00:00:00+00:00</published><updated>2015-07-31T00:00:00+00:00</updated><id>https://cswhjiang.github.io/2015/07/31/nag-and-cm</id><content type="html" xml:base="https://cswhjiang.github.io/2015/07/31/nag-and-cm.html"><![CDATA[<p>冲量（Classical Momentum， 简写为 CM ）和 Nesterov 加速 （ Nesterov’s Accelerated Gradient (NAG) ） 在 SGD 中常用，他们的步骤相似。经典的冲量表示如下：</p>

\[\begin{align}
\Delta \theta_t &amp;= \alpha \Delta \theta_{t-1} - \eta \nabla f(\theta_{t-1}) \\
\theta_t &amp;= \theta_{t-1} + \Delta \theta_t
\end{align}\]

<p>Nesterov’s Accelerated Gradient (NAG) 的方法表示如下 [1]</p>

\[\begin{align}
y_{s+1} &amp;= x_s - \eta \nabla f(x_s) \\
x_{s+1} &amp;= (1+\alpha)y_{s+1} - \alpha y_s
\end{align}\]

<p>其中 \(\eta\) 是步长，在 NAG 中 \(\eta = 1/\beta\)， \(\alpha = \frac{\sqrt{Q}-1}{\sqrt{Q}+1}\)， \(Q\) 是函数的条件数。NAG 的理解比较困难，Sébastien Bubeck 提供了一个从几何角度的解释 [2]。其实 NAG 可以表示为经典的冲量类似的形式 [3]。</p>

<p>我们定义 \(\theta_s = y_s\)， 以及 \(\Delta \theta_{s+1} = \theta_{s+1} - \theta_s\)， 从 NAG 的 \(x_s\) 的 updating rule 可以得到</p>

\[\begin{align}
x_{s+1} &amp;= (1+\alpha) \theta_{s+1} - \alpha \theta_s \\
&amp;= \theta_{s+1} + \alpha (\theta_{s+1} - \theta_s) \\
&amp;= \theta_{s+1} + \alpha \Delta \theta_{s+1}
\end{align}\]

<p>因此有 \(x_{s} = \theta_{s} + \alpha \Delta \theta_{s}\)， 代入 NAG 的 \(y_{s+1}\) 迭代公式可以得到</p>

\[\begin{align}
 \theta_{s+1} &amp;= \theta_{s} + \alpha \Delta \theta_{s} - \eta \Delta f(\theta_{s} + \alpha \Delta \theta_{s}) \\
 \Rightarrow \ \Delta \theta_{s+1} &amp;= \alpha \Delta \theta_{s} - \eta \Delta f(\theta_{s} + \alpha \Delta \theta_{s})
\end{align}\]

<p>因此 NAG 可以看作如下的更新过程</p>

\[\begin{align}
\Delta \theta_{s+1} &amp;= \alpha \Delta \theta_{s} - \eta \Delta f(\theta_{s} + \alpha \Delta \theta_{s}) \\
\theta_{s+1} &amp;=  \theta_s + \Delta \theta_{s+1} 
\end{align}\]

<p>和 CM 对比可以看出， 他们的区别仅仅在于求梯度的步骤， NAG 的梯度要比 CM 要提前一步。如果步长合适， NAG 比 CM 有优势，如果不合适就情况就不一定了。下图中用的步长是对于 NAG 在理想情况下的步长。代码见<a href="https://gist.github.com/cswhjiang/676b410a975b65761e8d">这里</a>。从图中可以看出 NAG 确实比 CM 更稳定一点。其实如果步长选的不合适，有些情况下 CM 可能会比 NAG 稳定， 因为在求梯度的时候 NAG 比 CM 更激进一点。
<img src="/figures/gd_cm_nag_my.png" alt="nag和cm的比较" /></p>

<h1 id="reference">Reference</h1>
<ol>
  <li>Bubeck, Sébastien. “Theory of convex optimization for machine learning.” arXiv preprint arXiv:1405.4980 (2014).</li>
  <li><a href="https://blogs.princeton.edu/imabandit/2015/06/30/revisiting-nesterovs-acceleration/">Revisiting Nesterov’s Acceleration</a></li>
  <li>Sutskever, Ilya, et al. “On the importance of initialization and momentum in deep learning.” Proceedings of the 30th international conference on machine learning (ICML-13). 2013.</li>
</ol>]]></content><author><name>Wenhao Jiang</name><email>cswhjiang@gmail.com</email></author><summary type="html"><![CDATA[冲量（Classical Momentum， 简写为 CM ）和 Nesterov 加速 （ Nesterov’s Accelerated Gradient (NAG) ） 在 SGD 中常用，他们的步骤相似。经典的冲量表示如下：]]></summary></entry><entry xml:lang="zh-CN"><title type="html">Generalized linear models</title><link href="https://cswhjiang.github.io/2015/06/07/generalized-linear-model.html" rel="alternate" type="text/html" title="Generalized linear models" /><published>2015-06-07T00:00:00+00:00</published><updated>2015-06-07T00:00:00+00:00</updated><id>https://cswhjiang.github.io/2015/06/07/generalized-linear-model</id><content type="html" xml:base="https://cswhjiang.github.io/2015/06/07/generalized-linear-model.html"><![CDATA[<p>广义线性模型（Generalized Linear Models，不要和 General Linear Models 搞混）是 John Nelder 和 Robert Wedderburn 提出的 [1]。我们的任务是在给定一个训练数据集 \(D =\{(x_1,y_1), \cdots, (x_n,y_n) \}\)，要学习一个假设 \(h(x)\) 能预测 \(y\) 的值。在线性模型中我们用 \(h(x) = x^T\beta\)，在广义线性模型中我们用 \(h(x) = f(x^T \beta)\)，其中 \(f(\cdot)\) 是非线性函数，称作激活函数（activation function），也称作响应函数（response function），它的反函数叫做连接函数（link function）。函数 \(f\) 由给定 \(x\) 时 \(y\) 的分布决定。</p>

<hr />

<h2 id="exponential-family-distributions">Exponential Family Distributions</h2>

<h3 id="formulations">Formulations</h3>
<p>指数族分布是指有着如下形式的分布</p>

\[\begin{align}\label{exponential_family_distributions}
 p(y;\eta) = b(y)\exp\{ \eta^T T(y) - a(\eta)\}.
\end{align}\]

<p>其中</p>

<ul>
  <li>\(\eta\) 叫做自然参数（也叫指数参数）</li>
  <li>\(T(y)\) 是充分统计量 （很多时候 \(T(y) = y\)，这时候的分布叫做经典形式（canonical form），这时候的 \(\eta\) 叫做经典参数）。</li>
  <li>\(a(\eta)\) 是 log-partition function (也叫 normalization factor, cumulant generating function) 。它使得 \(p(y; \eta)\) 是个分布。</li>
  <li>\(b(y)\) non-negative base measure (很多时候为 1).</li>
</ul>

<p>当给定 \(T, a, b\) 的时候，参数 \(\eta\) 就确定了一族的分布，不同的 \(\eta\) 就定义了在这一族中不同的分布。 很多分布都是指数族分布，比如
Gaussian, Multionmial, Dirichlet, Poisson, Gamma 分布等。不是指数族分布的分布包括: Cauchy, uniform 等。</p>

<h3 id="properties">Properties</h3>

<ul>
  <li>充分统计量 \(T(y)\) 的维度由自然参数 \(\eta\) 的个数决定。</li>
  <li>指数族分布的乘积依然是指数族分布，但是可能是没有归一化的。</li>
  <li>\(a(\eta)\) 称作累积发生函数（cumulant generating function，注意不是 Moment-Generating Function），　\(a(\eta)\)　有如下的性质：</li>
</ul>

\[\begin{align}
 E(T(y)) &amp;= \frac{d a(\eta)}{ d \eta} \nonumber \\
 Var(T(y)) &amp;= \frac{d^2 a(\eta)}{ d \eta^2} \nonumber
\end{align}\]

<ul>
  <li>Log-partition function \(a(\eta)\) 以及一阶导数都是凸函数。</li>
  <li>能使得 \(a(\eta) &lt; \infty\) 成立的 \(\eta\) 的集合称作 natural parameter space.</li>
  <li>每个指数族分布都有共轭分布。</li>
</ul>

<h3 id="examples">Examples</h3>

<h4 id="gaussian-distribution">Gaussian Distribution</h4>
<p>高斯分布的概率密度函数为</p>

\[\begin{align}
 p(x) &amp;= \frac{1}{\sqrt{2\pi \sigma^2}} \exp\{ -\frac{(x-\mu)^2}{2\sigma^2}\} \nonumber \\
 &amp;= \frac{1}{\sqrt{2\pi \sigma^2}} \exp\{ -\frac{x^2}{2\sigma^2} + \frac{\mu x}{\sigma^2} - 
\frac{\mu^2}{2\sigma^2} \} \nonumber \\
 &amp;= \frac{1}{\sqrt{2\pi}} \exp\{ \log(\sigma) -\frac{x^2}{2\sigma^2} + \frac{\mu x}{\sigma^2} - 
\frac{\mu^2}{2\sigma^2} \} \nonumber
\end{align}\]

<p>因此</p>

\[\begin{align}
 \eta &amp;= \left( \begin{array}{c}
\mu/\sigma^2 \\
-1/(2\sigma^2)\\
\end{array} \right)  \nonumber \\
 T(x) &amp;= \left( \begin{array}{c}
x \\
x^2\\
\end{array} \right)  \nonumber \\
 a(\eta) &amp;=  -\log(\sigma) + \frac{\mu^2}{2\sigma^2} = 
-\frac{\eta_1^2}{4\eta_2}-\frac{1}{2} \log(-2 \eta_2)\nonumber \\
 b(x) &amp;=   \frac{1}{\sqrt{2\pi}} \nonumber 
\end{align}\]

<h4 id="multivariate-gaussian-distribution">Multivariate Gaussian Distribution</h4>
<p>多变量高斯分布的概率密度函数为</p>

\[\begin{align}
 p(x) = \frac{1}{(2\pi)^{D/2} |\Sigma|^{1/2}} \exp\{-\frac{1}{2} (x-u) \Sigma^{-1} (x-u) \}
\end{align}\]

\[\begin{align}
 \eta &amp;= \left( \begin{array}{c}
\Sigma^{-1}\mu \\
-\frac{1}{2} \Sigma^{-1}\\
\end{array} \right)  \nonumber \\
 T(x) &amp;= \left( \begin{array}{c}
x \\
xx^T\\
\end{array} \right)  \nonumber \\
 b(x) &amp;=   (2\pi)^{-\frac{D}{2}} \nonumber 
\end{align}\]

<h4 id="bernoulli-distribution">Bernoulli Distribution</h4>
<p>Bernoulli distribution 可以写作如下的形式：</p>

\[\begin{align}
 p(y;\phi) &amp;= \phi^{y}(1-\phi)^{1-y} \nonumber \\
 &amp;= \exp\{y \log(\phi) + (1-y)\log(1-\phi)\} \nonumber \\
 &amp;= \exp\{ \log(\frac{\phi}{1-\phi})y + \log(1-\phi)\}
\end{align}\]

<p>根据此形式，我们可以得到：</p>

\[\begin{align}
\eta &amp;= \log(\frac{\phi}{1-\phi}) \nonumber \\
 T(y) &amp;= y \nonumber \\
 a(\eta) &amp;= -\log(1-\phi) =\log(1+e^{\eta}) \nonumber \\
 b(y) &amp;= 1 \nonumber 
\end{align}\]

<p>因此 \(\phi = \frac{1}{1-e^{-\eta}}\)。</p>

<h4 id="multinomial-distribution">Multinomial Distribution</h4>

\[\begin{align}
  p(x ; \mu) &amp;= \Pi_{k=1}^{M} \mu_{k}^{x_k} = \exp\{\sum_{k=1}^M x_k \log{\mu_k} \} \\
  &amp; = \exp\{\eta^T x + \log(1+\sum_{k=1}^M \eta_k)^{-1} \}
 \end{align}\]

<p>其中</p>

\[\begin{align}
 \mu_{k} = \frac{\exp(\eta_k)}{1+\sum_j \exp(\eta_j)}
\end{align}\]

<hr />

<h2 id="generalized-linear-models">Generalized Linear Models</h2>

<p>我们需要做下面假设（来自Andrew Ng的讲义）：</p>

<ul>
  <li>\(y \mid x ; \theta \sim \textrm{ExponentialFamily}(\eta)\)。在给定 \(x\) 和 \(\theta\) 的时候，\(y\) 服从指数族分布，这个指数族分布的参数是 \(\eta\)。</li>
  <li>自然参数 \(\eta\) 和输入是线性关系 \(\eta = x^T \beta\)（如果 \(\eta\) 是向量，那么 \(\eta_i = x^T \beta_i\)）</li>
  <li>输出 \(h(x) = E_{y \mid x}[y] = \frac{d a(\eta)}{d \eta}\)。</li>
</ul>

<p>从第二个假设能看出来 \(\theta\) 通过自然参数 \(\eta\) 作用于这个分布，\(\theta\) 被隐式地包含于函数 \(a(\eta)\) 中。如果 \(y\) 是标量，那么这个指数族分布可以表示为以下的形式：</p>

\[\begin{align}
  p_{\beta}(y\mid x) = b(y)\exp\{ x^T \beta y - a(x^T \beta)\}.
\end{align}\]

<p>如果 \(y\) 是一个向量，那么可以表示为如下的形式</p>

\[\begin{align}
 p_{B}(y \mid x) = b(y)\exp\{ y^T(B x)- a(B x)\}.
\end{align}\]

<p>在第三个假设中 \(h(x)\) 是 \(\eta\) 的函数，其形式由具体的分布决定。如果定义 mean parameter \(\theta\)，它满足 \(\theta = E[T(y)]\)。也可以将指数族函数写成如下的形式</p>

\[\begin{align} 
 p(y;\eta) = b(y)\exp\{ \eta(\theta)^T T(y) - a(\eta(\theta))\}.
\end{align}\]

<p>GLM中包含一下三个部分：</p>

<ul>
  <li>随机部分（即响应变量 \(y\)），这是 GLM 里面唯一的含有随机的成分的地方。在给定 \(x\) 后 \(y\) 服从经典指数族分布（\(T(y) = y\)）。注意有些分布不能写成经典形式，比如：LogNormal 分布。因此不会有条件分布是 LogNormal 的 GLM。</li>
  <li>系统部分。这一部分是所有的 GLM 共同的部分。这一部分定义了协变量 \(x\) 通过将自然参数 \(\eta =x^T \beta\) 来进入 GLM。</li>
  <li>连接部分。连接部分将 \(x^T \beta\) 和 mean parameter \(\theta\) 通过一个单调可微函数 \(g(\cdot)\) 连接起来：</li>
</ul>

\[\begin{align}
  g(\theta) &amp;= x^T \beta \nonumber \\
 E[y] &amp;= \theta = g^{-1}(x^T \beta) \nonumber 
 \end{align}\]

<p>函数 \(g(\cdot)\) 称作连接函数（也就是上面公式中的 \(\eta(\theta)\)）， \(g^{-1}(\cdot)\) 称作响应函数（即一开始提到的　\(f(\cdot)\)， 也即是 \(\nabla_{\eta}a(\eta)\)）。连接函数是 \(\textrm{mean parameter} \mapsto \textrm{natural parameter}\)，而响应函数是 \(\textrm{natural parameter}　\mapsto  \textrm{mean parameter}\)。</p>

<h3 id="training">Training</h3>

<p>在给定一个训练数据集 \(D = \{(x_1,y_1), \cdots, (x_n,y_n) \}\)，要计算在测试数据集上的 \(E_{y \mid x}[y]\)，我们需要估计 \(\beta\)。可以通过最大化 log-likelihood 来求解：</p>

\[\begin{align}
 l(\beta \mid D) &amp;= \log\left(  \Pi_{i=1}^{n} b(y_i)\exp\{ \eta_i^T y_i - a(\eta_i)\} \right) 
\nonumber \\
&amp;= \log\left(  \Pi_{i=1}^{n} b(y_i)\exp\{ y_i (x_i^T \beta) - a(x_i^T \beta)\}  \right) \nonumber \\
&amp;= \sum \log (b(y_i)) + \beta^T \sum y_i x_i  - \sum a(\beta^T x_i) 
\end{align}\]

<p>由于函数 \(a(\cdot)\)  是凸函数，因此可以通过 Newton-Raphson 方法来找到最优解：</p>

\[\begin{align}
 \beta_{t+1} =\beta_{t} - [H(l(\beta))]^{-1} \nabla_{\beta} l(\beta)
\end{align}\]

<h3 id="examples-of-glm">Examples of GLM</h3>

<h4 id="ordinary-least-squares">Ordinary Least Squares</h4>

\[\begin{align}
y \mid x \sim N(x^T \beta, \sigma^2)
\end{align}\]

<p>log-likelihood 表示如下</p>

\[\begin{align}
  l(\beta \mid D) &amp;= \log \left( \Pi_{i} \frac{1} {\sqrt{2 \pi \sigma^2}} \exp \left\{-\frac{(y_i-  x_i^T \beta)^2}{2\sigma^2}\right\} \right) \nonumber \\
&amp;= n \log(\frac{1}{\sqrt{2 \pi \sigma^2}})  - \sum_{i}  \frac{(y_i- x_i^T \beta)^2}{2\sigma^2} 
\end{align}\]

<h4 id="logistic-regression">Logistic Regression</h4>

<p>\(y \mid x \sim \textrm{Bernoulli}(\phi)\)
根据　\(\eta =  \log(\frac{\phi}{1-\phi}) = \beta^T x\)，可以得到 \(\phi = \frac{1}{1+e^{-\beta^T x}}\) 也就是　\(h(x)\)。
log-likelihood 表示如下：</p>

\[\begin{align}
  l(\beta \mid　D)  &amp;= \log \left( \Pi_{i}  \exp\left\{ y_i\cdot \beta^T x_i  + \log(\frac{e^{-\beta^T x}}{1+e^{-\beta^T 
x}})\right\}  \right) \\
&amp;= \sum_i y_i\cdot \beta^T x_i  -  \log (1+e^{\beta^T 
x})
\end{align}\]

<p>通常，也可以用 \(\{-1,+1\}\) 来做类标，用logistic loss的目标函数表示为：</p>

\[\min_{\beta} \sum_{i} \log (1+e^{-y_i \beta^T x_i})\]

<p>这个两个目标函数是等价的。在 liblinear 中为了避免在指数函数中处理类标，用另一个等价的目标函数</p>

\[\min_{\beta} \sum_{i} \log(1 + e^{-\beta^T x_i}) + \sum_{i: y_i = -1} \beta^T x_i\]

<hr />

<h2 id="reference">Reference</h2>
<ol>
  <li>J. A. Nelder and R. W. M. Wedderburn. Generalized linear models. Journal of the Royal Statistical Society. Series A (General), 135(3):pp. 370–384, 1972.</li>
  <li>Stephen Senn and John Nelder. A conversation with john nelder. Statistical Science, 18(1):pp. 118–131, 2003.</li>
</ol>]]></content><author><name>Wenhao Jiang</name><email>cswhjiang@gmail.com</email></author><summary type="html"><![CDATA[广义线性模型（Generalized Linear Models，不要和 General Linear Models 搞混）是 John Nelder 和 Robert Wedderburn 提出的 [1]。我们的任务是在给定一个训练数据集 \(D =\{(x_1,y_1), \cdots, (x_n,y_n) \}\)，要学习一个假设 \(h(x)\) 能预测 \(y\) 的值。在线性模型中我们用 \(h(x) = x^T\beta\)，在广义线性模型中我们用 \(h(x) = f(x^T \beta)\)，其中 \(f(\cdot)\) 是非线性函数，称作激活函数（activation function），也称作响应函数（response function），它的反函数叫做连接函数（link function）。函数 \(f\) 由给定 \(x\) 时 \(y\) 的分布决定。]]></summary></entry><entry xml:lang="zh-CN"><title type="html">Proximal Gradient Methods</title><link href="https://cswhjiang.github.io/2015/05/03/proximal-gradient-method.html" rel="alternate" type="text/html" title="Proximal Gradient Methods" /><published>2015-05-03T00:00:00+00:00</published><updated>2015-05-03T00:00:00+00:00</updated><id>https://cswhjiang.github.io/2015/05/03/proximal-gradient-method</id><content type="html" xml:base="https://cswhjiang.github.io/2015/05/03/proximal-gradient-method.html"><![CDATA[<h2 id="proximal-operator">Proximal Operator</h2>
<p>对于凸函数 \(f(x)\)， proximal operator 的定义为</p>

\[\textrm{prox}_{f}(v) = \textrm{argmin}_{x} \left( f(x) + \frac{1}{2} \|x-v\|_2^2\right).\]

<p>它是由 Moreau 提出的对于投影的扩展。对于一个凸集 \(C\) 以及一点 \(y\)，要找它在凸集上的投影我们需要解如下的问题：</p>

\[\min_{x} I_C(x) + \frac{1}{2}\|x-y\|^2\]

<p>其中 \(I_C(x)\)  是一个凸集 \(C\)  的 indicator 函数， 当 \(x \in C\) 时， \(I_C(x)=0\)， 当 \(x \notin C\)  时， \(I_C(x)= \infty\)。
Proximal operator 的定义就是把函数 \(I_C(x)\) 换成了更一般的凸函数。</p>

<p>通常我们会遇到针对函数 \(\lambda f\) 的 proximal operator。相似的，它的定义为</p>

\[\textrm{prox}_{\lambda f}(v) = \textrm{argmin}_{x} \left( f(x) + \frac{1}{2\lambda} \|x-v\|_2^2\right).\]

<p>通常 \(\textrm{prox}_{f}(v)\) 也称作 \(v\) 的对于函数 \(f\) 的 proximal point。如果 \(x^*\) 最小化函数 \(f\)， 等价于 \(x^* = \textrm{prox}_{f}(x^*)\)。这样的点叫做 \(\textrm{prox}_{f}\)  的 fixed points。因此找函数的 minimizer 就和 operator  的 fixed points 相关联了。以此需要了解一下 operator 的东西。</p>

<h3 id="proximal-operator-and-fixed-points">Proximal Operator and Fixed Points</h3>
<p>这一节简要介绍  proximal operator 的 fixed points， 主要整理自 <a href="http://stanford.edu/class/ee364b/lectures/monotone_slides.pdf">Stanford EE364b 的 leture notes</a>，目的是从 operator 的角度来解释为什么迭代地应用 proximal operator 能收敛到最优解。</p>

<p>首先定义 relation R 是一个 \(R^n \times R^n\) 上的子集，然后定义</p>

\[R(x) = \{ y \mid (x,y) \in R\}.\]

<p>一个 \(R^n\) 上的 relation F 是 monotone 如果对于对所有的 \((x,u), (y,v) \in F\) 都满足如下的条件：</p>

\[(u-v)^T(x-y) \geq 0 .\]

<p>我们称 Relation \(F\) 有 Lipschitz 常数 \(L\)， 如果对所有的 \(x,y \in \textrm{dom} F\) 满足如下的条件</p>

\[\|F(x) - F(y)\|_2 \leq L\|x-y\|_2.\]

<p>如果 \(L=1\), \(F\) 称作 nonexpansive，如果 \(L &lt; 1\) 那么 \(F\) 是一个 contraction。如果 \(F\) 是 nonexpansive 的，那么它的 fixed point 集合是凸集。如果 \(F\) 是 contraction， 那么它有一个 fixed points， 并且可以由如下的迭代来找到：</p>

\[x^{k+1} = F(x^k).\]

<p>但是如果 \(F\) 是 nonexpansive， 此过程不一定收敛（即使 \(F\) 的 fixed point set 是空集也不一定收敛）。但是如果我们定义另一个 operator \(T = (1-\alpha) I + \alpha F\) （\(T\) 和 \(F\) 有相同的 fixed points），其中 \(\alpha \in (0,1)，\)  \(T\) 会收敛到 \(T\) 的 fixed point，其实也就是 \(F\) 的 fixed point。这个迭代过程可以表示为：</p>

\[x^{k+1} = (1-\alpha) x^k + \alpha F(x^k).\]

<p>这称作 \(F\) 的 damped iteration。\(T\) 称作 \(F\)的 \(\alpha\)-averageed operators。</p>

<p>Proximal operator 满足如下被称为 firmly nonexpensiveness 的条件：</p>

\[\|\textrm{prox}_{f}(x) - \textrm{prox}_{f}(y)\|_{2}^2 \leq (x-y)^T(\textrm{prox}_{f}(x) - \textrm{prox}_{f}(y)).\]

<p>满足这个条件的 operator 被称为 firm nonexpensive operator。这样的 operator 是\(\frac{1}{2}\)-averaged operator。总之，contraction 和 firmly nonexpensiveness 的 operator 是 averaged operator 的子集。 因此迭代地使用 proximal operator 会收敛到 fixed point。</p>

<h3 id="inperpretations-of-proximal-operator">Inperpretations of Proximal Operator</h3>

<p>从 proximal operator 的定义可以看出， \(\textrm{prox}_{\lambda f}(v)\) 也是这个问题的解：</p>

\[x = v - \lambda \nabla f(x) ,\]

<p>这并不是一个梯度的迭代步骤。可以从以下的角度理解 proximal operator。</p>

<h4 id="moreau-envelope">Moreau Envelope</h4>
<p>函数 \(\lambda f\) 的 Moreau envelope 定义如下：</p>

\[M_{\lambda f}(v) = \inf_x \left( f(x) + \frac{1}{2\lambda }\|x-v\|_2^2 \right).\]

<p>二维的 Moreau envelope 图形可以看<a href="http://oldweb.cecm.sfu.ca/projects/CCA/FCT/demo/HTML/">这里</a>。Moreau envelope 其实是 \(f\) 的光滑的近似版本。他们有着相同的最优解。根据 proximal operator 的定义，我们可以把 Moreau envelope 表示为：</p>

\[M_{\lambda f}(v) =  f(\textrm{prox}_{\lambda f}(v)) + \frac{1}{2\lambda }\|\textrm{prox}_{\lambda f}(v)-v\|_2^2.\]

<p>Moreau envelope 的导数可以表示为：</p>

\[\nabla M_{\lambda f}(v) = \frac{1}{\lambda } (v - \textrm{prox}_{\lambda f}(v)).\]

<p>因此，</p>

\[\textrm{prox}_{\lambda f}(v) = v - \lambda   \nabla M_{\lambda f}(v) .\]

<p>所以 proximal operator 可以看做是在其 Moreau envelope 上的梯度下降，步长为 \(\lambda\)。</p>

<h4 id="modified-gradient-descent">Modified Gradient Descent</h4>
<p>我们考察 proximal operator 在函数 \(f\) 的一阶和二阶近似上的行为。我们记其在 \(v\) 附近的 一阶和二阶的近似为</p>

\[\begin{align}
f_v^{(1)} &amp;= f(v) + \nabla f(v)^T (x-v) \\
f_v^{(2)} &amp;= f(v) + \nabla f(v)^T (x-v) + \frac{1}{2}(x-v)^T \nabla^2 f(v) (x-v).
\end{align}\]

<p>我们可以求出 proximal operator 的解析解如下</p>

\[\begin{align}
\textrm{prox}_{\lambda f_v^{(1)}} &amp;= v - \lambda \nabla f(v) \\
\textrm{prox}_{\lambda f_v^{(2)}} &amp;= v - (\nabla^2 f(v) + \frac{1}{\lambda} I )^{-1} \nabla f(v) .
\end{align}\]

<p>因此，如果每一个步骤都用 \(f\) 的一阶的近似，那么 proximal operator 就是一个标准的梯度下降，如果每一个步骤用 \(f\) 的二阶近似，那么 proximal operator 是加了正则的牛顿迭代。如果 \(\lambda  \to 0\)， \(\textrm{prox}_{\lambda f_v^{(2)}} \approx v - \lambda \nabla f(v)\)，此时相当于没有用到二阶的信息。</p>

<p>另外，从问题 \(x = v - \lambda \nabla f(x)\) 考虑，如果 \(\lambda  \to 0\)， \(x \approx v - \lambda \nabla f(v)\)，此时 \(\textrm{prox}_{\lambda f}\) 近似为 \(f\) 上的一个梯度下降的步骤。</p>

<hr />

<h2 id="proximal-gradient-method">Proximal Gradient Method</h2>
<p>对于凸函数 \(f\) 可以直接用如下的迭代</p>

\[x^{k+1} = \textrm{prox}_{\lambda f} (x^k)\]

<p>来找到最优解。但是极少被使用，因为 \(f\) 加上二次的项这个目标函数有可能不那么容易优化。但是如果目标函数可以分解成两个项的和，比如我们的问题可以表示为</p>

\[\min f(x) + g(x),\]

<p>通常 \(f(x)\)是光滑可微的，但 \(g(x)\) 不一定可微， 例如 \(g(x)\)可以是 \(\ell_1\)-norm。 我们可以用如下的迭代来解</p>

\[x^{k+1} = \textrm{prox}_{\lambda^k g} (x^k - \lambda^k \nabla f(x^k)).\]

<p>这称为 proximal gradient method。 当 \(f\) 是 \(L\)-smooth 的，并且用固定的步长 \(\lambda^k \in [0,L]\) 的时候有 convergence rate \(O(1/k)\)。如果 \(L\) 不知道，可以用 line search 来找到合适的步长。</p>

<p>这个过程可以用 majorization minimization (MM) 来理解。 用 MM 算法来找函数 \(h(x)\) 的最优解可以表示为如下的迭代过程</p>

\[x^{k+1} = \textrm{argmin}_{x} \hat{h}(x, x^k),\]

<p>其中凸函数 \(\hat{h}(x, x^k)\) 是 \(h(x)\) 的 tight upper bound，也就是有 \(\hat{h}(x, x^k) \geq h(x)\) 并且 \(\hat{h}(x^k, x^k) = h(x^k)\) 成立。这样的 upper bound 叫 matorization，它不一定唯一。MM 算法每一步都是在最小化 matorization。 对于我们关心的问题，我们考虑函数 \(f(x)\)的一个 matorization ：</p>

\[\hat{f}_{\lambda}(x,y) = f(y) + \nabla f(y)^T(x-y) + \frac{1}{2\lambda} \|x-y\|_2^2.\]

<p>当 \(\lambda \geq \frac{1}{L}\) 的时候， \(\hat{f}_{\lambda}(x,y) \geq f(x)\) 并且 \(\hat{f}_{\lambda}(x,x) = f(x)\)。 定义函数 \(q_{\lambda} (x,y)\) 为</p>

\[q_{\lambda} (x,y) = \hat{f}_{\lambda}(x,y)  + g(x).\]

<p>显然， \(q_{\lambda} (x,y)\)  是 \(f(x)+g(x)\) 的 majorization。因此我们的问题可以用如下的迭代步骤来解</p>

\[x^{k+1} = \textrm{argmin}_{x} q_{\lambda}(x,x^k).\]

<p>这恰好就是如下 proximal operator的迭代步骤：</p>

\[x^{k+1} = \textrm{prox}_{\lambda^k g} (x^k - \lambda^k \nabla f(x^k)).\]

<p>上面的方法的 convergence rate 是 \(O(1/k)\)，通过 Nesterov’s method 来加速到 \(O(\frac{1}{k^2})\)。步骤如下：</p>

\[\begin{align}
y^{k+1} &amp;= x^k + \omega^k(x^k - x^{k-1}) ,\\
x^{k+1} &amp;= \textrm{prox}_{\lambda^k g} (y^k - \lambda^k \nabla f(y^k)).
\end{align}\]

<p>其中 \(\omega^k \in [0,1)\)，\(\omega^k\) 需要以特定的方法选出来。一个简单的方法是 \(\omega^k = \frac{k}{k+3}\)。对于加速版本的 proximal gradient method 的 \(\lambda\) 也可以用 line search 的方法来找。</p>

<hr />

<h2 id="reference">Reference</h2>
<ol>
  <li>Parikh, Neal, and Stephen Boyd. “Proximal algorithms.” Foundations and Trends in optimization 1.3 (2013): 123-231.</li>
</ol>]]></content><author><name>Wenhao Jiang</name><email>cswhjiang@gmail.com</email></author><summary type="html"><![CDATA[Proximal Operator 对于凸函数 \(f(x)\)， proximal operator 的定义为]]></summary></entry><entry xml:lang="zh-CN"><title type="html">Strong Convexity and Smoothness</title><link href="https://cswhjiang.github.io/2015/04/08/strong-convexity-and-smoothness.html" rel="alternate" type="text/html" title="Strong Convexity and Smoothness" /><published>2015-04-08T00:00:00+00:00</published><updated>2015-04-08T00:00:00+00:00</updated><id>https://cswhjiang.github.io/2015/04/08/strong-convexity-and-smoothness</id><content type="html" xml:base="https://cswhjiang.github.io/2015/04/08/strong-convexity-and-smoothness.html"><![CDATA[<p>函数自身的性质对 convergence rate 有很大的影响，优化中主要用以下的两种度量来刻画函数的性质。</p>

<h2 id="alpha-strong-convexity">\(\alpha\)-strong Convexity</h2>

<p>一个函数 \(f: \mathcal{X} \mapsto \mathbb{R}\) 是 \(\alpha\)-strong convex 需要满足以下的条件：</p>

\[f(x) - f(y) \leq \nabla f(x)^T(x-y) - \frac{\alpha}{2}\|x-y\|_P^2,\]

<p>其中 \(\|\cdot\|_{P}\) 是 norm，例如 \(\ell_2\)-norm。其实此定义对不可微分的函数也成立，只要把导数换成 subgradient。\(f(y)\)在 \(x\)出的二阶近似为：</p>

\[f(y) \approx f(x) + \nabla f(x)^T(y-x) + (y-x)^T\nabla^2f(x)(y-x).\]

<p>\(\alpha\)-strong convexity 的意思是要求 \(f(y)\) 比当我们以 identity matrix 来近似做 Hessian matrix 的时候的近似值要大。也就是对于任意的\(y\) 找到一个凸的二次的lower bound：</p>

\[f(x)  + \nabla f(x)^T(y-x) + \frac{\alpha}{2}\|x-y\|_2^2 .\]

<p>\(\alpha\)可以看做函数 curvature 的一种度量。对于线性函数，\(\alpha\)为0。在优化中，大的 \(\alpha\)会有更好的 convergence rate 。 因为大的 \(\alpha\) 表示曲率大，因此表示梯度下降的步长大。</p>

<p>Strongly convex 的函数一定是 strictly convex 的，但是反之不成立。 \(f(x) = x^4\)  是 strictly convex 但不是 strongly convex。 \(f(x) = \mid x \mid\) 是 convex，不是 strongly convex，因此也不是 strictly convex。 因此 strongly convex 函数是凸函数中有更好性质、更便于处理的一部分。</p>

<p>\(\alpha\)-strong convexity 有如下的性质：</p>

<ol>
  <li>
    <p>如果 \(f_1(x)\) 和 \(f_2(x)\) 分别是 \(\mu_{1}\)-strongly convex 和 \(\mu_{2}\)-strongly convex，那么 \(f(x) = \alpha f_1(x) + \beta f_2(x)\) 是 \((\alpha \mu_1 + \beta \mu_2)\)-strongly convex 的。</p>
  </li>
  <li>
    <p>如果 \(f(x)\)是 \(\alpha\)-stongly convex 的，那么 
\(f(y) \leq f(x) + \nabla f(x)^T(y-x) + \frac{1}{2\alpha} \|\nabla f(x) - \nabla f(y)\|^2\).</p>
  </li>
  <li>
    <p>如果 \(f(x)\)是 \(\alpha\)-stongly convex 的，那么 
\(\left(\nabla f(x) - \nabla f(y)\right)^T(x-y) \leq \frac{1}{\alpha} \|\nabla f(x) - \nabla f(y)\|^2\).</p>
  </li>
</ol>

<p>\(\alpha\)-strong convexity 的函数可以推出以下等价的结论（其中 \(\mu \in [0,1]\)）：</p>

<ol>
  <li>
    <p>函数 \(x \mapsto f(x) - \frac{\alpha}{2}\|x\|_2^2\)  是凸函数。</p>
  </li>
  <li>
    <p>\(\left(\nabla f(x) - \nabla f(y)\right)^T(x-y) \geq \alpha \|x-y\|^2\).</p>
  </li>
  <li>
    <p>\(\mu f(x) + (1-\mu) f(y) \geq f(\mu x + (1-\mu)y) + \mu (1-\mu) \frac{\alpha}{2} \|x-y\|^2\).</p>
  </li>
  <li>
    <p>\(\nabla^2 f(x) \succeq \alpha I\).</p>
  </li>
</ol>

<hr />

<h2 id="beta-smoothness">\(\beta\)-smoothness</h2>

<p>如果一个连续可微的函数 \(f(x)\) 的梯度 \(\nabla f(x)\) 是 \(\beta\)-Lipschitz 的，即：</p>

\[\|\nabla f(x) - \nabla f(y)\| \leq \beta \|x -y\|,\]

<p>那么我们称 \(f(x)\)  是 \(\beta\)-smooth 的。 更一般的表示为</p>

\[\|\nabla f(x) - \nabla f(y)\|_{D} \leq \beta \|x -y\|_{P},\]

<p>其中 \(\|\cdot\|_{P}\) 是 norm， \(\|\cdot\|_{D}\) 是 dual norm。给定一个\(\beta\)-smooth 的函数可以推出以下的等价的结论（其中 \(\mu \in [0, 1]\) 并且 \(f\) 是凸函数）：</p>

<ol>
  <li>
    <p>\(0 \leq f(y) - f(x) - \nabla f(x)^T (y-x) \leq \frac{\beta}{2} \|x-y\|_2^2\) .</p>
  </li>
  <li>
    <p>\(f(x) + \nabla f(x)^T (y-x) + \frac{1}{2\beta}\|\nabla f(x) - \nabla f(y)\|^2 \leq f(y)\).</p>
  </li>
  <li>
    <p>\(\frac{1}{\beta}  \|\nabla f(x) - \nabla f(y)\|^2 \leq \left(\nabla f(x) - \nabla f(y)\right)^T(x-y)\).</p>
  </li>
  <li>
    <p>\(\left(\nabla f(x) - \nabla f(y)\right)^T(x-y) \leq \beta \|x-y\|^2\).</p>
  </li>
  <li>
    <p>\(\mu f(x) + (1-\mu)f(y) \geq f(\mu x + (1-\mu)y) + \frac{\mu(1-\mu)}{2\beta} \| \nabla f(x) - \nabla f(x)\|^2\).</p>
  </li>
  <li>
    <p>\(\mu f(x) + (1-\mu)f(y) \leq f(\mu x + (1-\mu)y) + \frac{\mu(1-\mu)}{2\beta} \| x-y\|^2\).</p>
  </li>
  <li>
    <p>\(0 \preceq \nabla^2f(x)\preceq \beta I\).</p>
  </li>
</ol>

<p>如果 \(f(x)\) 是 \(\alpha\)-stongly convex，那么有：</p>

\[\left(\nabla f(x) - \nabla f(y)\right)^T(x-y) \geq \frac{\alpha\beta}{\alpha + \beta} \|x-y\|^2 + \frac{1}{\alpha + \beta} \| \nabla f(x) - \nabla f(x)\|^2.\]

<p>函数的  \(\beta\)-smoothness 和  \(\alpha\)-strong convexity 有对偶的关系。如果一个函数 \(f(x)\)是对于 norm \(\|\cdot\|_D\) 的 \(\beta\)-smooth 的，那么 \(f^*(x)\) 是关于 norm \(\|\cdot\|_D\) 的 \(\frac{1}{\beta}\)-strongly convex 的，其中 \(f^*(x) = \max_{y}(y^Tx - f(y))\) 是函数 \(f(x)\) 的 convex conjugate 。</p>

<hr />

<h2 id="condition-number">Condition Number</h2>

<p>把这两个度量放一起定义函数的条件数 (condition number)为： \(Q = \frac{\beta}{\alpha}\)。\(Q\)其实是函数 \(f(x)\)的 Hessian matrix 的条件数的上限。\(Q\) 对在 \(f(x)\) 上的梯度下降的速度有很大影响， \(Q\)越小的目标函数越容易收敛。</p>

<hr />

<h2 id="reference">Reference</h2>
<ol>
  <li>Nesterov, Y. “Introductory lectures on convex optimization: a basic course. 2004.”</li>
  <li>Bubeck, Sébastien. “Theory of convex optimization for machine learning.” arXiv preprint arXiv:1405.4980 (2014).</li>
</ol>]]></content><author><name>Wenhao Jiang</name><email>cswhjiang@gmail.com</email></author><summary type="html"><![CDATA[函数自身的性质对 convergence rate 有很大的影响，优化中主要用以下的两种度量来刻画函数的性质。]]></summary></entry><entry xml:lang="zh-CN"><title type="html">A Short Note on Learning Theory</title><link href="https://cswhjiang.github.io/2015/01/07/A-short-note-on-learning-theory.html" rel="alternate" type="text/html" title="A Short Note on Learning Theory" /><published>2015-01-07T00:00:00+00:00</published><updated>2015-01-07T00:00:00+00:00</updated><id>https://cswhjiang.github.io/2015/01/07/A-short-note-on-learning-theory</id><content type="html" xml:base="https://cswhjiang.github.io/2015/01/07/A-short-note-on-learning-theory.html"><![CDATA[<p>统计机器学习理论主要是关于有监督学习的理论。统计学习理论是关于通过观察到的过去来预测未来的事情，我们需要做这样的假设：过去和未来的样本是从同一个未知的分布中独立采样的。独立表示了新的样本蕴含最多的信息。同分布表示观察到的样本都是关于同一个潜在的现象。实际中的样本肯定不完全满足这个假设，因此有人也在研究不满足这个假设的统计学习理论。</p>

<p>首先介绍所用到的符号和概念。输入空间 \(\mathcal{X}\) 和输出空间 \(\mathcal{Y}\)，我们假设\((X,Y) \in \mathcal{X} \times \mathcal{Y}\) 是来自未知分布\(P\)的随机变量。因此我们观察到 \(n\) 个 从 \(P\) 中独立同分布的采样 \((X_i,Y_i)\)。我们的目标是从候选集合 \(\mathcal{F}\) 里面找到一个函数 \(f: \mathcal{X} \rightarrow \mathcal{Y}\) 使得 \(f\) 能很好的预测 \(Y\)。</p>

<p>为了评价 \(f\) 的好坏，我们用损失函数 \(l\)（或者称为风险函数）来定义对于 \(f\) 的风险（或称为损失）\(R(f) = \mathbb{E}[ l(f(X), Y)]\)。对于分类问题损失函数为：</p>

\[{ l(f(X), Y) = \mathbf{1}_{f(X) \neq Y} },\]

<p>对于回归问题损失函数 \(l\) 一般为：</p>

\[l(f(X),Y ) = (f(X)-Y)^2。\]

<p>我们用 \(\hat{f}\) 来表示学习算法从观察到的\(n\)个训练样本得到的函数，即：</p>

\[\hat{f} = \textrm{argmin}_{f \in \mathcal{F}} \sum_{i=1}^n l(f(x_i), y_i) ,\]

<p>用 \(f^{*}\) 来表示候选集合 \(\mathcal{F}\)中最优的函数，即</p>

\[f^{*} = \textrm{argmin}_{f \in \mathcal{F}} \mathbb{E}[ l(f(X), Y)]。\]

<p>用 \(R(f) = \mathbb{E}[l(f(X),Y)]\) 表示函数 \(f\) 的真正的loss或者称为真正的risk(true loss or true risk)，它是在整个的 \(P\) 的support上的期望；\(\hat{R}(f) = \frac{1}{n}\sum_{i=1}^n l(f(X_i),Y_i)\) 表示在已经观察到的样本上面的损失。自然的我们可以理解 \(R(f_n)\)， \(R(f^{*})\)，\(\hat{R}(f_n)\)，\(R_n(f^{*})\) 的意义。 显然我们有如下的关系成立 \(R^* &lt; R(f^*) \leq R(f_n)\)。注意\(R(f_n)\) 是随机变量，因为它依赖观察到的样本。</p>

<p>假如我们知道 \(P(Y\mid X)\)，我们定义 \(t(x) = \mathbb{E}[Y|X = x]\)。注意 \(t\) 不一定在 \(\mathcal{F}\) 中，此时函数 \(t\) 对应的 true loss 记为
\(R^{*}\)，它称为贝叶斯风险，这是理论上的最小的风险。但是通常由于 \(P(Y\mid X)\) 不知道，因此贝叶斯风险是无论如何都达不到的。</p>

<p>统计机器学习的主要问题（目标）：</p>

<ol>
  <li>
    <p>我们是否能设计算法来找到 \(\hat{f}\) 使得 \(R(f_n)\) 接近 \(R(f^*)\)</p>
  </li>
  <li>
    <p>我们是否能保证\(\hat{f}\) 趋进可能的最好的风险(即 \(f\) 从所有可能的函数里面选择所达到的风险，\(\inf_{f} R(f)\)，其实也就是贝叶斯风险)</p>
  </li>
  <li>
    <p>\(\hat{f}\) 是如何的依赖 \(n\) 的。我们期望要达到相应的性能需要的 \(n\) 越小越好。</p>
  </li>
  <li>
    <p>我们需要对 \(P\) 和 \(\mathcal{F}\) 做什么假设？</p>
  </li>
</ol>

<p>其中问题1和问题2是关于界理论，3是关于样本复杂度。</p>

<p>设计机器学习算法的时候需要考虑一下几个问题:</p>

<ol>
  <li>
    <p>近似。候选集合 \(\mathcal{F}\) 究竟有多好？也就是说 \(\inf_{f \in \mathcal{F}}\) 有多接近 \(\inf_{f}
R(F)\)？</p>
  </li>
  <li>
    <p>估计。由于我们只能通过观察到的 \(n\) 个样本来得到未知分布 \(P\) 的信息，那么对于 \(f \in \mathcal{F}\) 我们的估计
\(\hat{R}(f)\) 有多接近 \(R(f)\)?</p>
  </li>
  <li>
    <p>计算。怎么用观察到的 \(n\) 个样本来计算\(f_n\)。算法的效率如何。</p>
  </li>
</ol>

<p>界理论:
为了有好的性能，我们主要想让 \(R(\hat{f}) - R^*\) 小。 它可以做如下的分解</p>

\[R(\hat{f}) - R^* = (R(\hat{f}) - R(f^*)) + (R(f^*) - R^*)。\]

<p>其中第一个部分成为估计误差，第二部分成为近似误差。估计误差表示 \(f_n\) 有多接近候选集合 \(\mathcal{F}\) 中的最有函数，近似误差表示 \(\mathcal{F}\) 中的函数有多接近目标(如果 \(t \in \mathcal{F}\) 则近似误差为0)。估计误差依赖观察到的样本因此其实是随机变量。近似误差的估计很难，因为我们没有 \(R^*\)（函数\(t\)）的信息。还由于一些别的原因（如果不对假设，近似误差收敛到0可以任意地慢），因此我们一般仅仅考虑估计误差 \(R(f_n) - R(f^*)\)。 显然 \(R(f^*)\) 仅仅依赖 \(\mathcal{F}\)，因此让估计误差最小，可以变成两个步骤：</p>

<ol>
  <li>
    <p>选择一个好的 \(\mathcal{F}\);</p>
  </li>
  <li>
    <p>在选择了一个不错的 \(\mathcal{F}\) 基础上让 \(R(f_n)\) 小。</p>
  </li>
</ol>

<p>我们将 \(R(\hat{f})\) 分解为：</p>

\[R(\hat{f}) = \hat{R}(\hat{f}) + (R(\hat{f}) - \hat{R}(\hat{f}))，\]

<p>因此算法设计的目标是让经验风险最小并且让经验误差尽可能接近真实的风险。这样就有了 trade off。</p>

<p>因此总结一下我们主要关心的界:</p>

<ol>
  <li>
    <p>错误界： \(R(\hat{f}) \leq \hat{R}(\hat{f}) +
B_1(n,\mathcal{F})\)。这个界定了估计的误差和实际的误差的差距，也是实际能估计的界（基于均值收敛与期望的界）。</p>
  </li>
  <li>
    <p>相对于候选集合里面最优函数的错误界： \(R(\hat{f}) \leq R(f^*) + B_2(n,\mathcal{F})\)。这个界给定了如果给定的模型是正确的（即\(t
\in \mathcal{F}\)）的误差界。</p>
  </li>
  <li>
    <p>相对于贝叶斯误差的错误界： \(R(\hat{f}) \leq R^* + B_3(n,\mathcal{F})\)。这个界其实是我们真正关心的关心的误差界。</p>
  </li>
</ol>

<p>关于 Domain Adaptation：如果观测到的数据（training set 或者 source dommain）和未来的数据 （testing set 或者 target domain）不是来自同一个分布，记 \(P_S\) 和 \(P_T\)，但是他们有很强的相关性，即分布的某种意义下的距离很小。我们的目标是建立此种背景下的统计学习理论。我们的目标是确定 \(R_T(\hat{f}) - R_T^*\)，其中 \(\hat{f}\) 是在 source domain 上由算法得到的函数。这里我们用 \(R_T(f)= \mathbb{E}_{P_T}[l(f(X),Y)]\) 表示在target domain上面的真实误差。我们先定义 \(f_{S}^* = \textrm{argmin}_{f \in \mathcal{F}} \mathbb{E}_{P_S}[l(f(X),Y)]\) 和 \(f_{T}^* = \textrm{argmin}_{f \in \mathcal{F}} \mathbb{E}_{P_T}[l(f(X),Y)]\)。类似的我们有如下的分解</p>

\[\begin{align}
 &amp; R_T(\hat{f}) - R_T^*   \\
 = &amp;  (R_T(\hat{f}) - R_T(f_T^*)) + (R_T(f_T^*)- R_T^*)  \\
 = &amp; (R_T(\hat{f}) - R_S(f_T^*)) + (R_S(f_T^*) - R_T(f_T^*)) + (R_T(f_T^*)- R_T^*) 
%  = &amp; (R_T(\hat{f}) - R_S(\hat{f}) ) + (R_S(\hat{f})  - R_S(f_T^*)) + (R_S(f_T^*) - R_T(f_T^*)) +
% (R_T(f_T^*)- R_T^*) 
\end{align}\]

<p>在此种分解下，我们需要给出 \(R_T(\hat{f})\) 的界。我们分解</p>

\[\begin{align}
 &amp; R_T(\hat{f})  \nonumber \\
= &amp; (R_T(\hat{f}) - R_S(\hat{f})) + R_S(\hat{f})  \nonumber \\
= &amp;  (R_T(\hat{f}) - R_S(\hat{f})) + (R_S(\hat{f}) - \hat{R}_{S}(\hat{f})) + \hat{R}_{S}(\hat{f}) \\
= &amp;  (R_T(\hat{f})  - \hat{R}_{S}(\hat{f})) + \hat{R}_{S}(\hat{f})
\end{align}\]

<p>\(\hat{R}_{S}(\hat{f})\) 通常是目标函数的一部分，\((R_S(\hat{f}) - \hat{R}_{S}(\hat{f}))\)从经典的统计学习理论也容易计算，所以我们要求 \((R_T(\hat{f}) - R_S(\hat{f}))\) 的界。对于 domain adaptation 通常假设 covariate shift 是个不合理的假设，因为通常在 source domain 和 target domain 之间有个不小的 margin。 其实 Domain Adaptation 成功的等价条件是：</p>

<ol>
  <li>
    <p>\(P_S\) 的距离 \(P_T\) 接近。</p>
  </li>
  <li>
    <p>存在一个分类器在观测到的数据和未来的数据上分类误差都不大。</p>
  </li>
</ol>

<p><em>这是很久之前做的笔记，不是很完整，以后也可能会持续修改。发现错误请在下面留言，我会尽快修改。</em></p>]]></content><author><name>Wenhao Jiang</name><email>cswhjiang@gmail.com</email></author><summary type="html"><![CDATA[统计机器学习理论主要是关于有监督学习的理论。统计学习理论是关于通过观察到的过去来预测未来的事情，我们需要做这样的假设：过去和未来的样本是从同一个未知的分布中独立采样的。独立表示了新的样本蕴含最多的信息。同分布表示观察到的样本都是关于同一个潜在的现象。实际中的样本肯定不完全满足这个假设，因此有人也在研究不满足这个假设的统计学习理论。]]></summary></entry></feed>