面试大题:
机器学习128题
深度学习78题 ===============(10/78)
python25题
NLP28题
笔试题:
。。。。。。。
Python
机器学习
1. 归一化 VS 标准化
常用场景:
向量归一化:即向量除以其模。
标准化:深度网络中的输入标准化,来加快收敛速度。
深度学习
1. 生成对抗网络
生成对抗网络的一个简单解释如下:假设有两个模型,一个是生成模型(Generative Model,下文简写为G),一个是判别模型(Discriminative Model,下文简写为D),判别模型(D)的任务就是判断一个实例是真实的还是由模型生成的,生成模型(G)的任务是生成一个实例来骗过判别模型(D) ,两个模型互相对抗,发展下去就会达到一个平衡,生成模型生成的实例与真实的没有区别,判别模型无法区分自然的还是模型生成的。
生成器: 对于生成器,输入需要一个n维度向量,输出为图片像素大小的图片。因而首先我们需要得到输入的向量。 Tips: 这里的生成器可以是任意可以输出图片的模型,比如最简单的全连接神经网络,又或者是反卷积网络等。这里大家明白就好。这里输入的向量我们将其视为携带输出的某些信息,比如说手写数字为数字几,手写的潦草程度等等。
由于这里我们对于输出数字的具体信息不做要求,只要求其能够最大程度与真实手写数字相似(能骗过判别器)即可。所以我们使用随机生成的向量来作为输入即可,这里面的随机输入最好是满足常见分布比如均值分布,高斯分布等。 Tips: 假如我们后面需要获得具体的输出数字等信息的时候,我们可以对输入向量产生的输出进行分析,获取到哪些维度是用于控制数字编号等信息的即可以得到具体的输出。而在训练之前往往不会去规定它。
判别器: 对于判别器不用多说,往往是常见的判别器,输入为图片,输出为图片的真伪标签。 Tips: 同理,判别器与生成器一样,可以是任意的判别器模型,比如全连接网络,或者是包含卷积的网络等等。
训练过程:
2. Tensorflow
-
tensorflow 的计算图
Tensorflow是一个通过计算图的形式来表述计算的编程系统,计算图也叫数据流图,可以把计算图看做是一种有向图。Tensorflow中的每一个节点都是计算图上的一个Tensor, 也就是张量,而节点之间的边描述了计算之间的依赖关系(定义时)和数学操作(运算时)。
3. 常用的参数初始化(以下公式来自pytorch)
Xavier初始法论文:http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf
He初始化论文:https://arxiv.org/abs/1502.01852
svd初始化论文:https://arxiv.org/abs/1312.6120
-
uniform均匀分布初始化:
w = np.random.uniform(low=-a, high=a)
① Xavier初始法,适用于普通激活函数(tanh,sigmoid):
② He初始化,适用于ReLU:(fan_mode 可以是 fan_in (default) 或 fan_out. Choosing fan_in preserves the magnitude of the variance of the weights in the forward pass. Choosing fan_out preserves the magnitudes in the backwards pass.)
-
normal高斯分布初始化:
w = np.random.randn(n_in,n_out) * std #std为高斯分布的标准差,均值设为0
① Xavier初始法,适用于普通激活函数 (tanh,sigmoid):
② He初始化,适用于ReLU: (fan_mode的定义同上)
-
svd初始化(又称正交初始化,orthogonal):对RNN有比较好的效果。
4. 梯度裁剪
def clip_grad_norm_(parameters, max_norm, norm_type=2):
if isinstance(parameters, torch.Tensor):
parameters = [parameters]
parameters = list(filter(lambda p: p.grad is not None, parameters))
max_norm = float(max_norm)
norm_type = float(norm_type)
if norm_type == inf:
total_norm = max(p.grad.data.abs().max() for p in parameters)
else:
total_norm = 0
for p in parameters:
param_norm = p.grad.data.norm(norm_type)
total_norm += param_norm.item() ** norm_type # ###########核心
# 所谓梯度裁剪判断的阈值是,所有参数的梯度的范数
total_norm = total_norm ** (1. / norm_type) # ###########核心
clip_coef = max_norm / (total_norm + 1e-6) # ###########核心
if clip_coef < 1:
for p in parameters:
# 通过乘以系数,保证所有参数的梯度的范数等于指定值
p.grad.data.mul_(clip_coef) # ###########核心
return total_norm
卷积神经网络
1. causal conv
当我们对输入数据的顺序很注重的时候,因果卷积(causal conv)便可以发挥作用。
Causal最初跟随WaveNets一起提出。WaveNets是一个生成模型,主要用来生成音乐。WaveNets是利用卷积来学习t时刻之前的输入数据(音频),来预测t+1时刻的输出。也就是说,该模型输出的最后的X的概率会是如公式-3 所示。在公式-3 和PPT中的动态图片中,我们可以看出,t时刻的输出仅仅依赖于1,2,…,t-1时刻的输入,不会依赖于t+1时刻以及之后时刻的输入。这与BiLSTM的思想截然不同。
当你的模型有这种特殊要求时,便可以采用casual。
在实现上,1D的casual 主要是通过padding来实现的。在2D的casual 主要是通过mask filter map来实现的。
2. dilated conv
Dilated conv在ICLR 2016上提出。其主要作用是在不增加参数和模型复杂度的条件下,可以指数倍的扩大视觉野的大小。
下图所示,是kernel_size=2,strides=1,padding=0,分别经过4层dilated={1,2,4,8}的卷积后,得到一个output值。
假设kernel_size=m,dilated=d,则膨胀之后的卷积核大小为(m-1)*d+1。
3. 感受野的计算
4. 其他
-
CNN最成功的应用是在CV,那为什么NLP和Speech的很多问题也可以用CNN解出来?为什么AlphaGo里也用了CNN?这几个不相关的问题的相似性在哪里?CNN通过什么手段抓住了这个共性?
答:以上几个不相关问题的相关性在于,都存在局部与整体的关系,由低层次的特征经过组合,组成高层次的特征,并且得到不同特征之间的空间相关性。