“你好 2021”

“我的 2020 年终总结”

一瞬间 2020 年也就过去了,我也还是按照常规做一个我自己的 2020 年的年终总结吧。有人说年终总结是来「凡尔赛」的,可能确实有人的年终总结是故意的炫耀吧,但我觉得更多人的年终总结只是来对过去的一年画上一个句号,并期盼新一年的开始。而且,记录下来,多年之后能回忆起来 2020 年发生的种种事情,也是一种财富吧。 世界で最高のガールフレンドを見つけました! 有时间来真正去学机器学习!学习了 Pytorch 的用法,以及一些常见的 CNN,NLP 的结构,技巧等等! 加…

“赛博朋克 2077:我心中的又一精品”

对得起我三年的等待

2020 年 12 月 10 日,赛博朋克 2077 终于发售了。作为巫师三 10 刷的剧情党来评价一下赛博朋克 2077,我觉得完全超出了我的期待。本以为我已经丧失了对游戏的激情,但赛博朋克 2077 又将这股力量从我内心唤醒了。 我呢,因为是剧情党嘛,一般会根据剧情来划分游戏品质。画面,音乐和玩法固然重要,但我最为看重的还是一个引人入胜的故事。简单的说:主线都玩不下去的,我认为是垃圾,例子就不提了,免得被喷,这种游戏我买就当捐钱行善了;主线还行,支线…

“分布式情景下的 Batch Normalization 处理”

为什么分布式训练中 Batch Normalization 会极大干扰网络训练

Batch Normalization (BN) Batch Normalization 的 motivation 大概是这样的。在深度学习过程中,每一层网络都会对输入的数据做一次映射。于是随着网络的不断加深,前面 n 层的网络对输入数据的影响是累加的。所以对于 n+1 层来说,每一次输入的数据都是数据集的原始数据通过 n 次的映射后的值。所以非常有可能对于 n+1 层来说,每一次输入的数据不是一个分布的,所以每一次第 n+1 层都会去重新学习对于当前分布的参数。这样网络的学习就会被拖慢,甚至导致无法训练。 另外,当我们使用饱和激…

“反向传播算法的数学推导”

本文严重参考了 CSDN 反向传播算法(过程及公式推导) 基本定义 在上图所示的简单神经网络中,layer 1 是输入层,layer 2 是隐藏层,layer 3是输出层。我们用上图来阐述一些变量名称的意义: 通过上面的定义,我们可以知道: z_{j}^{l} = \sum_{i}w_{ji}^{l}a_{i}^{l-1} + b_{j}^{l} a_{j}^{l} = \sigma z_{j}^{l} = \sigma \left( \sum_{i}w_{ji}^{l}a_{i}^{l-1} + b_{j}^{l} \right) 我们令损失函数为二次代价函数 (Quadratic Cost Function) : J = \frac{1}{2n} \sum_{x} \lvert \lvert y(x) - a^{L}(x) \rvert \rvert ^ {2} 其中, x 表示输入样本, y(x) 表示实际分类, a^{L}(x) 表示预测分类, L 表示网络的最大层数。当只有一个输入样本时,损失函数 J 标…

“生活环境升级!!!”

最近家里升级了千兆宽带,电信公司带着人来各种装修,又换线又换路由器。我也趁着这波升级换了一波设备,目前感觉非常不错,于是来盘点一下,顺便水一篇博客。 网络线路升级 因为我需要 VPN,而我爸妈不需要,所以之前从光猫分出来接了 2 个路由器,对应两套网络。同时光猫除了解析光信号,还拨号。这就导致了第一,WIFI 信号之间的干扰非常严重,有些时候我离路由器直线距离不到 5 米就只有一格信号了;第二,层级过多,光猫一层 NAT,路由器一层 NAT,有…

“如何计算深度学习优化方法的收敛率”

以 Stochastic Gradient Descent 为例

收敛率是什么? 我们小学三年级学的数值分析告诉我们,如果函数 f(x) 是收敛的,即 \lim_{k \rightarrow\infty}\vert\vert x_k - x^* \vert\vert = 0 ,其中 \lim_{k \rightarrow\infty}f(x_k) = x^* ,那么有: \lim_{k \rightarrow\infty} \frac{\vert\vert x_{k+1} - x^*\vert\vert}{\vert\vert x_k-x^*\vert\vert} = a 其中, a 就是 f(x) 的收敛率。 基本理论 SGD 基础 在深度学习的问题当中,我们一般是去解决这样的问题: \min_{x}f(x) = \sum_{i=1}^{n}f_i(x) 其中, f(x) 是模型, i 是每一个样本, x 是我们要优化的参数, n 是所有的样本。 然后在利用 SGD 对模型进行更新的时候,一般是这样更新的: x_{t+1} = x_{t} - \mu \nabla f_i{x_t} 这个应该大家都可以理解吧,就是一个梯度更新公…

“当按下电源后,x86 CPU 的 OS 是如何被启动的?”

x86 CPU 的 OS 启动流程

当 x86 CPU 电源联通后,它的 EIP (The Instruction Pointer) 被硬编码到地址 0xFFFFFFF0,即内存的最后 16 位。这时 CPU 是处于实模式 (Real Mode) 的,所以相当于从 0xFFFFFFF0 开始 CPU 可以执行一条命令。 实模式 (Real Mode)保护模式 (Protected Mode) 是 CPU 的两种工作模式,实模式是早期 CPU 的工作模式,保护模式是现代 CPU 的工作模式。实模式出现在 8086 CPU 时代,运行的是 16 位指令。但 16 位 CPU 最多支持 1MB 的寻址(20 根地址线),所以后来内存越来越大后寄存器的位数就变成了 32 位。所以就引入了保护模式, 用来实现更大空间的,更

“编写你自己的内存分配器”

Make your own memory allocator

在这篇文章中我将带着大家实现一个自己的内存分配器。这个内存分配器 十分简单 ,它旨用于帮助大家对操作系统内部的内存分配过程有更深的理解。所以它并不会很高效。简单的说,这个内存分配器 只是能用 ( Just works )。 我们主要会使用 C 语言来进行编程。但在编程前,我们首先要对我们操作系统的内存存储方式有一定的了解。 操作系统的内存存储 我们的操作系统的内存中,主要存在着 5 个部分。这 5 个部分分别是: kernel: 存储着我们的操作系统的…

“反馈边问题 NP-Complete 证明”

反馈边 (Feedback Arc Set)问题的描述如下。给定一个有向图 G ,问是否可以移除小于等于 k 条边使得 G 中没有循环。首先这个问题显然是 NP 问题。即给定移除的 k 条边,我只需要先把这 k 条边移除,然后判断剩下的图中是否有循环就可以了。判断循环的方法为从一个点出发,记录经过的点,判断当前点是否已经走过,若走过即存在循环。而这个操作是显然可以在多项式时间内完成的。 现在,我们把顶点覆盖问题归约到反馈边问题来证明反馈边问题是 NP 难的…

“子图同构问题 NP-Complete 证明”

子图同构(Subgraph isomorphism problem)问题的描述如下。给定两个图 G_1 G_2 ,判断 G_1 是否与 G_2 的一个子图同构。首先假如我们得到了 G_1 G_2 和对应的解(即 G_2 的子图 G_s 使得 G_s G_1 同构),我们只需要遍历解中的点和每一个与这个点相连接的边,检查是否与 G_1 对应即可验证解的正确性。所以这个问题首先显然是一个 NP 问题。 为了证明这个问题同时也是一个 NP 难问题,我们将 分团问题 规约到 子图同构问题上来。具体地,假设我们现在有一个有解的分团问题 % <![CDATA[ <G,k> %]]> ,即 G 中存在 k 个点可以…