机器学习部分
反向传播 (Back propagation)vs 梯度下降(Gradient descent)
反向传播算法是用来训练ANN的。简而言之,训练ANN就是通过反向传播代价,以减少代价为导向,调整参数。
调参的方式是采用梯度下降算法(Gradient descent),沿着梯度方向调整参数大小。
反向传播算法的推导可以看博客:反向传播算法具体推导过程
交叉熵
其中在soft target时,用到了raise the temperature策略,来提高soft target对应的cross entropy。
熵,说白了就是信息量。在dark knowledge论文中,Hinton提到利用soft target来提高交叉熵,就是要增大模型学到的信息量。(存疑)
为何CNN中的激活函数采用的是ReLU?
神经网络中常见的激活函数有sigmoid
, tanh
,而在CNN中我们最常使用的是ReLU
。原因有一下三点:
1. 采用sigmoid等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用ReLU激活函数,整个过程的计算量节省很多。
2. 对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失,无法完成深层网络的训练。
3. ReLU会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。
C++部分
字符串处理函数
- 长度函数
int strlen(const char s[])
:返回字符串中的字符个数,不计尾零。sizeof()
计尾零。 - 复制函数
char * strcpy(char to[], const char from[])
- 拼接函数
char * strcat(char s1[], const char s2[])
:返回指针指向s1串。 - 比较函数
int strcmp(const char s1[], const char s2[])
:按从前到后顺序逐个比较对应字符的ASCII码值。若s1中的字符串大于s2中的则返回值大于零;若两字符串相等,则返回0;否则返回值小于零。