Home avatar

时光似海

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进行一定程度抽象,每一层都支持正向传播、反向传播、更新参数

同态加密登陆

在服务器日常登录过程中,一般是前端传输账号和密码到服务器,然后服务器对账号密码进行校验。但在这个过程中有两个问题,假设传输过程中信息被截获(或者打印日志然后日志泄漏等操作),可能导致密码泄漏。如果服务器数据泄漏,也会导致密码泄漏。一般来说我们服务器中存储的是密码的sha256,这样可以解决服务器数据泄漏的问题,但是传输过程中的问题没有解决(前端hash再传输是无效的,因为这样做hash后的值等效于密码)。我们希望提出一种方案,同时满足传输过程中信息任意泄漏,服务器数据任意泄漏,也可以保证密码的安全。

想法来源:

同态加密允许加密一个值,并使用加密后的值进行运算。实现同态加密有多种方式,这里简单介绍一个简要例子

选择一个自然数作为基数(这个基数需要具备一些特定的属性),将基数记为g,用 g去加密一个值,即g为底数,需要加密的值为指数。比如,我们要加密一个数值 3,取 g为 5: