“记录一次神奇的 ZEIT Debug 经历”

事情是这样的,总所周知因为我的博客每次构建的时候会涉及到一些动态内容以及优化,所以它是被 host 在 ZEIT 的服务器上。具体的来说,在构建的时候我会通过脚本启动一个本地 NodeJS 服务器,然后 Jekyll 通过 RPC 来调用指令或的结果。我随机给 NodeJS 服务器设置了一个 5001 端口,然后这样的配置也一直稳定运行了一年多。 然后,从大概一年前开始,ZEIT 会随机对博客的构建过程报错,内容是 HTTP 请求不能发往 HTTPS 服务器。我傻了,一是我的 NodeJS 服务器就是 HTTP 服务器,二是本来这就…

“欢迎你的到来,勇敢的 (BRAVE) 访问者。

“你的「注意力」是对我最好的奖励”

Soptlog 作为我的个人项目,我认为把行业最新的、最先进的技术尽可能快的使用在 Soptlog 上是我的义务之一。幸运的是,我刚好又愿意在这个博客上花费我的一部分时间,所以 Soptlog 才会在非常早期就使用了静态网站博文加密功能,以及在各大操作系统普及系统暗黑模式之前就运用了系统级暗黑模式 API。除了这些访问者能够感受到的功能以外,在代码层面,很多行业领先的功能性、安全性、性能的优化也早已被引入了构建流程。 于是今天,又一个行业领先的…

“尝试 Mathjax 预渲染的一些问题”

在去年我宣布通过 ZEIT NOW(现在的 Vercel NOW)托管博客后,我的博客终于可以通过引入 Jekyll 插件的方式优化很多构建流程,所以其实我就在同步地改造很多底层的基础设施。现在已经过了一年了,这个博客用上了我自己实现的 Markdown 语法分析器和转换器,也有了数十多个插件用于优化我写博客和观众浏览博客的体验。例如 Mediun 式的图片懒加载,其实是博客在构建时将每一张图片的低清缓存直接插入 Html 文本;还例如博客加密插件让我终于可以不用去关注加密流程,而关注于…

“你好 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 位。所以就引入了保护模式, 用来实现更大空间的,更