Home avatar

时光似海

有栈协程切换原理

这篇应该是21年写的,当时在公司做分享的ppt,整理笔记翻到了,发出来当博客吧~

有栈协程就是实现了一个用户态的线程,用户可以在堆上模拟出协程的栈空间,当需要进行上下文切换的时候,主线程只需要交换栈空间和恢复一些相关的寄存器的状态就可以实现一个用户态的线程上下文切换,没有了从用户态转换到内核态的切换成本,的执行也就更加高效 —- 知乎

就后端开发来讲,有栈协程并没有提高程序的运行速度。 one event-loop per thread (IO multiplex)one connection per coroutine 快得多,因为协程上下文切换反而增加了开销

TinyRenderer笔记5:阴影和矫正透视变形 - 完结

之前渲染的模型中,物体明暗强弱主要通过光方向和法向量计算,并没有考虑光被遮挡的场景。

如何确认哪些部分的光被遮挡了呢?这个问题很简单,我们把摄像机朝向和平行光方向保持一致,进行一次渲染,得到的zbuffer就能表示光的视角能看到的部分,看不到的部分就是阴影!然后再进行正常的渲染。

TinyRenderer笔记4:着色器

OpenGL 2的渲染管道可以表示如下(新版本也差不多):
TinyRenderer笔记4:着色器-21.png
在较新的OpenGL中还有其他着色器,在这个课程中只关心顶点着色器(vertex shader)和片段着色器(fragment shader)。
在上面图片中,我们无法触摸的阶段都用蓝色表示,我们的回调用橙色表示。
事实上现在的main()函数是原始的处理程序(primitive processing routine),它可以叫做顶点着色器。我们在这里没有primitive assembly的步骤,由于我们仅绘制三角形在我们的代码中,它与primitive processing合并。现在的triangle()函数是是rasterizer,对于在三角形中的每个像素都调用了了片段着色器的功能,然后执行深度检查之类的。
知道了什么是着色器就可以开始创建着色器了。

TinyRenderer笔记3:移动摄像机

在欧几里得空间中,一个坐标可以由一个原点和基底给出,考虑点$P$在坐标系$(O,i,j,k)$中拥有坐标$(x,y,z)$的含义,它意味着向量$\overrightarrow{OP}$ 可以表示为:

$$ \overrightarrow{OP}=\vec{i}x+\vec{j}y+\vec{k}z = \begin{aligned} \begin{bmatrix} \vec{i}& \vec{j}& \vec{k} \end{bmatrix} \end{aligned} \begin{bmatrix} x \\ y \\ z \end{bmatrix} $$

现在我们有另外一个坐标系$(O,i’,j’,k’)$,如何将坐标从一个坐标系转换到另一个坐标系,首先$(i,j,k)$和$(i’,j’,k’)$是三维的基底,存在一个(非简并)矩阵$M$使得:

常用激活函数和损失函数

常用激活函数和损失函数.png
定义:

$$ \sigma(x) = \frac{1}{1+e^{-x}} $$

求导:

$$ \sigma' = \sigma(x)(1-\sigma(x)) $$

作为分类问题输出层的激活函数
将各个输出节点的输出值范围映射到[0, 1],并且约束各个输出节点的输出值的和为1
常用激活函数和损失函数-1.png

定义:

$$ softmax(z_i) = \frac{e^{z_i}}{\sum ^{K}_{j=1}e^{z_j}} $$

求导:设$softmax(z_i) = p_i$

rust手写神经网络

用rust实现上篇笔记:神经网络的结构 中描述的神经网络
还在实现中。。。

  • 确定loss函数,$f(x)$为样本的推理结果,$y$是目标结果,多个样本sum得出loss
$$ loss=\frac{1}{n}\sum^n_{i=1} (f(x_i)-y_i)^2 $$
  • 将训练样本分为n个batch,每个batch n个样本
  • 按batch进行训练,将batch中每个样本进行正向传播
  • 记录每个样本的结果,以及这个样本正向传播过程中的所有中间结果
  • 遍历完每个样本后,计算loss
  • 通过loss值对每个样本进行反向传播,过程中需要用到前面缓存的中间结果
  • 记录每个样本反向传播过得到的梯度,将所有样本的梯度求平均值,得到最终调整网络的梯度。因为loss是sum的,所以在算一个样本偏导时,其他样本为常量,求导是0,所以每个样本梯度可以独立计算。
$$ a^2 -2ab + b2 => 2a-2b => 2(a-b) => \frac{2(a-b)}{n} $$
  • 根据学习率调整网络参数
  • 将所有batch如此循环来一遍,完成一轮训练
  • 用所有训练样本计算下loss,多轮训练后得到满意的模型

要实现的是一个全连接神经网络,整个网络模型有很多层(Layer),除了输入层输出层,其余层都统称为隐藏层,对于要实现的网络可以叫全连接层。在每层里都有若干神经元,每个神经元上都保存着该神经元的偏置$b$和与上层神经元链接的每条边的权重$w$。 可以对Layer进行一定程度抽象,每一层都支持正向传播、反向传播、更新参数