澳门1495

什么下TensorFlow生成对抗样本。深度上之几栽模型的优化技术。

十月 3rd, 2018  |  澳门1495

要是说卷积神经网络是过去影帝的话,那么生成对抗已然成深度上研讨领域受到相同颗新晋的炫目新星,它用干净地改我们体会世界的方法。对抗学习训练吗点人工智能完成复杂任务提供了一个崭新的思路,生成对抗图片能够充分轻松的捉弄之前训练好的分类器,因此如何使生成对抗图片提高系统的鲁棒性是一个生有研究之热点问题。
神经网络合成的对峙样本很易受丁震惊,这是因对输入进行精细精心制作的乱就可能造成神经网络以随机选择的办法对输入进行不当地分类。鉴于对抗样本转移到物质世界,可以要该转移得可怜有力,因此就是一个值得关注之平安问题。比如说人脸识别,若一张对抗图像为于识别为真人的说话,就见面并发部分安全隐患及其后带来的巨大损失。对转移对抗图像感兴趣之读者可以关心一下多年来的Kaggle挑战赛NIPS。

  1. 多少增长(Data Augmentation)
    事在人为智能,或者说电脑视觉的一个最终目标在于构建一个确可适用于实际世界复杂环境的体系。而就当前所用之机上体系而言,大部分动了有监督的上方法,也自然导致了亟待大规模征集图像样本,并进行相应之图像标注的做事。而人力时有穷尽,高质量的样本集图片以是构建一个不错的机上系统的关键因素。使用方便的多少增长方法可以拿数据集的多寡增加深十加倍以上,从而极大化利用小样本集中之每个样本,使之为堪训练取得一个较好之机械上型。数据增长方法吧可以提高型的鲁棒性,防止该善在教练中起过拟合的面貌。
    常用之数目增长方法主要来源数字图像处理中之几何变换,但切莫转移图像遭到的诸如素值,而是改变了那空间位置,借这期待卷积神经网络学习到图像中再度多之不变性特征,也惠及增进该泛化性能。
    以下将对准各种法子做简单的罗列与认证。
    举手投足(Shift)变换:对老图片以图像平面内盖某种方式(预先定义或者擅自方式确定平移的幅度、范围及其方向)进行运动。
    扭曲(Flip)变换:沿竖直或者水平方向对原有图片展开翻转。
    随机裁剪(Random
    Crop):随机定义感兴趣区域因裁剪图像,相当给增加随机扰动。
    噪音扰动(Noise):对图像随机添加高斯噪声或者椒盐噪声等。
    本着比度变换(Contrast):改变图像对比度,相当给在HSV空间被,保持色调分量H不变,而改亮度分量V和饱和度S,用于模拟现实环境的光照变化。
    缩放变换(Zoom):以设定的百分比缩小或者放大图像。
    规则变换(Scale):与缩放变换有点类似,不过尺度变换的目标是图像内容一经非图像本身(可以参考SIFT特征提取方法),构建图像金字塔以获取不同尺寸、模糊程度的图像。
  2. 权重初始化(weight initialization)
    风土人情神经网络之所以一直无道加深网络的纵深,一个十分关键之案由在使随机梯度下降法训练时,随着训练迭代过程的入木三分会起梯度弥散的光景,也尽管导致了神经网络无法有效地打样本被开展上。而导致梯度弥散的一律组成部分由应归结为人情神经网络使用了权重随机初始化。
    倘若现代深度神经网络抛弃了随机初始化的方法,转而利用高斯初始化、
    Xavier算法等来化解当下无异问题。
    所谓的高斯初始化方法是依靠随机选择一个恒定均值(如0等)和一定方差(如0.01对等)的高斯分布中之值当网络各个神经元的权重参数的初值,从而确保权重参数训练开始时可高斯分布,以期获得更好的结果。这是同等种植常用之权重初始化方法。
    Xavier算法是Glorot于2010年提出的权值初始化方法。相比同自由初始化或者高斯初始化方法吃之人身自由选择,Xavier算法为各级一个深神经网络的初始权值进行了本性定制,因为他是依据输入输出神经元的个数来开展权重的初始化。该算法假设对于一个大网有n个线性神经元,其初始权值为W,网络出口为Y,即:
    Y=W_1 X_1+W_2 X_2+⋯+ W_n X_n (1-1)
    测算每个神经元输出的方差如下:
    Var(W_i X_i )=E[X_i ]^2 Var(W_i )+E[W_i ]^2 Var(X_i ) +
    Var(W_i )Var(X_i ) (1-2)
    假设有输入权重的均值为0,上述公式可以简化如下:
    Var(W_i X_i )= Var(W_i )Var(X_i ) (1-3)
    再者假设Xi和Wi都是单独与分布之,可得输出Y的方差:
    Var(Y)=Var(W_1 X_1+W_2 X_2+⋯+ W_n X_n )=nVar(W_i )Var(X_i )
    (1-4)
    故如果我们渴求输出分布要同输入的遍布一致,则nVar(Wi)的值应为1。
    尽管算法中使了成百上千使,可是每当其实行使过程被赢得了妙的功用。直观上来讲,对原有之Xavier算法来说,假要输入的均值为0对于人情的神经网络是情理之中之。因为那个初始化层之后是非线性激活层(tanh,sigmoid等)中之激活函数在0值附近的梯度值最要命。而对此当代深度神经网络而言,由于那个线性整流单元(ReLU)对于输入的应有一半为0,故He等提出以下公式作为替代。
    Var(W_i )=2/n_in (1-8)
  3. 肆意梯度下降法(Stochastic Gradient descent)
    梯度下降法(Gradient
    descent)是当下极度受欢迎的优化算法有,也是极度常用的吃水神经网络优化措施。它经过沿着当前函数点所对应之梯度的反方向进行迭代搜索,从而找到对象函数的极值点。许多家针对其提出了改良算法。
    标准梯度下降法可以表征为:
    θ(t+1)=θ_t- η∇θ E(L(θ_t) (1-9)
    个中η为每次迭代的学习率,L(θ)为对象函数。E[L(θ)]整套数据集的数学期望。
    规范梯度下降法要求在历次迭代的时段还如计算整个数据集的梯度方向。它可确保凸目标函数可以消灭到全局最小点,而对此非凸目标函数至少得消灭到有的极值点。近几十年来,样本数的增长速度远远盖处理器的精打细算能力的增高。从之角度达的话,统计机器上方法的受制在计算能力而休在于样本量的深浅。对于小样本上着正式梯度下降法是适用的,但是采取为死数额集时是无限缓慢的,整个数据集无法一次性装载进内存中的状更常见。因此专业梯度下降法无法胜任于现代大规模数据的优化任务,此时任意梯度下降法
    (stochastic gradient descent,
    SGD)的采用效益使远远好为专业梯度下降法。
    相比之下叫计算整个数据集的梯度方向,随机梯度下降法(SGD)以从训练集中随机选取的么样本来估计目标梯度,以迭代翻新参数θ。
    θ(t+1)=θ_t- η_t ∇θ L(θ_t;x^((t) ),y^((t) )) (1-10)
    以实际应用过程遭到,每次的参数更新并无是根据单个样本计算的,而是由于所定义的最好小批量样书(mini-batch)来计量的。这好下降单个样本参数更新的毒波动并要消失过程更加安定。由于用批量样书并无能够完全代表数据集的梯度方向,其参数更新的动乱也是无可避免的。但是这种波动一定水平达到一旦其能跨越反至神秘的再好的部分极小点,并且最终到达全局最小点。尽管理论及,随机梯度下降法(SGD)可以渐进收敛,但是当其实运用过程被按照发生众多挑战。
    首先,收敛的速在学习率η,一个当的学习率并无是那么爱确定的。如果学习率太小会造成没有过程绝缓慢,而过非常的读率η将会见阻止模型没有并导致目标函数在极端小值附近波动甚至发散。其次,对于神经网络这种惊人非线性任务而言,其目标函数通常都发生大气之次优局部极小点,为保证没有到全局最小点得避免训练过程陷入有极小点中。对于学习率或者学习策略的精选,可以参照以下措施:
  4. 选取一个敷小的,在第一不行迭代中好消灭的时数值(或选择两个获得该均值),如果没有速度有所减退,取η/2作为新的学习率;
  5. 以每次迭代从此引入评估机制,当半次于迭代内的变迁小于某个设定阈值时减小学习率。
    为了避免训练陷入有极小点,Qian等提出了根据动量(momentum)的梯度下降学习算法,通过多历史参数更新的权重项,加速时参数更新的历程并压缩颠簸。
    ν(t+1)=〖γν〗_t- η_t ∇θ L(θ_t;x^((t) ),y^((t) )) (1-11)
    θ(t+1)=θ_t+ν(t+1) (1-12)
    其中ν_(t+1)是当前之创新向量,γ即为动量,通常要为0.9还是其他常数。
    2013年,Sutskever等对民俗动量算法改进动量更新过程使得训练更加稳定。而Recht等提出并行SGD以适应现代海量数据集的训练任务。
  6. 批规范化(Batch normalization)
    当教练一个深度神经网络时,由于各级层参数不断转变,所以每层输入的概率分布也当持续的变动,也致使了非线性激活函数(如sigmoid等)正借助两度都见面饱和,使得训练迭代的过程易得太缓慢甚至束手无策展开。这时候,通常用使用较小的学习率以及巧夺天工进行权重初始化。loffe等用这种情景叫做“内部协方差偏移”(internal
    covariate shift),并提出了批判规范化(Batch
    normalization,BN)解决此类题材。
    该论文被提出当每次随机梯度下降迭代时,在最好小批量样本(mini-batch)内开规范化操作,使得出口结果各个维度的均值为0,方差为1,有效地避免了非线性激活函数的饱满问题(以sigmoid为条例,观察sigmoid函数即会,该函数输入集中在0附近经常,其出口梯度较充分);同时也叫梯度转移为参数及其初值的震慑减少。
    万一对当前隐含层执行规范化,其输入有d个,分别吗
    x=〖[x_1,x_1,…,x_d]〗^T,则该第k维输出如下:
    x ̂k = (x_k-μβ)/√(δ_β^2+ϵ) (1-13)
    其中,μβ和δβ^2个别吗极小批量样本的均值和方差。
    为提高其代表能力,原作中引入了相同针对可学习参数 γ,β,使得:
    y_k=〖BN〗_(γ,β) (x_k )= γx ̂_k+β (1-14)
    总体而言,批规范化(Batch normalization)作用可归纳如下:
    (1) 可以运用还胜的学习率,加快了教练进度;
    (2)
    可以移除或采用比较逊色的dropout(下同样稍节将作介绍)。dropout是常用的严防了拟合的措施,较逊色之dropout也可加强训练进度。
    (3)
    减少图像预处理的动。由于现行训练迭代次数下降,所以可以对样本数少做一些图像扭曲,让神经网络多打实际的多寡中读书。
    自,对于上述问题之解决办法并无是唯一的,Razvan等提出的本梯度(Natural
    Gradient)也是针对解决当下同题材的等同种思路。
  7. Dropout
    显,过拟合问题直接是机器上之算法的事为解决的问题。对于大型神经网络来说,其参数规模比于浅层学习算法有了跃进式的多,所以相对来说也愈加便于发生了拟合的景。而为解决了拟合问题,一般会动集成方法,即以训练多独模型进行重组,然而这种方式费时费力也不克保证收获预期成效。
    2012年,Hinton等提出Dropout用于缓解神经网络训练好了拟合的题材。通过在那个训练过程中,按照先确定的票房价值暂时屏蔽掉其中的某些神经元。由于这种屏蔽是暂时性而是无度的,对于自由梯度下降的话,相当给各级一样次于批量样本的训都是以教练一个新的网。极端情况下,对于一个n节点的网络,相当给以于训练2^n个不同网络型,
    但此时内需优化的参数数量实在不更换的,这吗决然水准达合人情的并方法的思索一经又缓解了其艰难的题材。
    该数学表达如下:
    y= εx (1-15)
    内部,ε以自然的概率p等于0,使得该神经元节点x暂时吃挡住。

每当当下篇稿子被,将手把手带领读者以TensorFlow实现一个简单易行的算法来合成对抗样本,之后采用这种技术建立一个鲁棒的敌视例子。

import tensorflow as tf
import tensorflow.contrib.slim as slim
import tensorflow.contrib.slim.nets as nets

tf.logging.set_verbosity(tf.logging.ERROR)
sess = tf.InteractiveSession()

先是,设置输入图像。使用tf.Variable而非是用tf.placeholder,这是为只要保她是可训练的。当我们用经常,仍然可输入其。

image = tf.Variable(tf.zeros((299, 299, 3)))

接下来,加载Inception v3模型。

def inception(image, reuse):
    preprocessed = tf.multiply(tf.subtract(tf.expand_dims(image, 0), 0.5), 2.0)
    arg_scope = nets.inception.inception_v3_arg_scope(weight_decay=0.0)
    with slim.arg_scope(arg_scope):
        logits, _ = nets.inception.inception_v3(
            preprocessed, 1001, is_training=False, reuse=reuse)
        logits = logits[:,1:] # ignore background class
        probs = tf.nn.softmax(logits) # probabilities
    return logits, probs

logits, probs = inception(image, reuse=False)

联网下去,加载预训练的权重。这个Inception v3的top-5的准确率为93.9%。

import tempfile
from urllib.request import urlretrieve
import tarfile
import os

data_dir = tempfile.mkdtemp()
inception_tarball, _ = urlretrieve(
    'http://download.tensorflow.org/models/inception_v3_2016_08_28.tar.gz')
tarfile.open(inception_tarball, 'r:gz').extractall(data_dir)

restore_vars = [
    var for var in tf.global_variables()
    if var.name.startswith('InceptionV3/')
]

saver = tf.train.Saver(restore_vars)
saver.restore(sess, os.path.join(data_dir, 'inception_v3.ckpt'))

连下,编写一些代码来展示图像,并针对它进行分类与展示分类结果。

import json
import matplotlib.pyplot as plt

imagenet_json, _ = urlretrieve(
    'http://www.anishathalye.com/media/2017/07/25/imagenet.json')

with open(imagenet_json) as f:
    imagenet_labels = json.load(f)

def classify(img, correct_class=None, target_class=None):
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 8))
    fig.sca(ax1)
    p = sess.run(probs, feed_dict={image: img})[0]
    ax1.imshow(img)
    fig.sca(ax1)

    topk = list(p.argsort()[-10:][::-1])
    topprobs = p[topk]
    barlist = ax2.bar(range(10), topprobs)

    if target_class in topk:
        barlist[topk.index(target_class)].set_color('r')
    if correct_class in topk:
        barlist[topk.index(correct_class)].set_color('g')

    plt.sca(ax2)
    plt.ylim([0, 1.1])
    plt.xticks(range(10),
               [imagenet_labels[i][:15] for i in topk],
               rotation='vertical')
    fig.subplots_adjust(bottom=0.2)
    plt.show()

以身作则图像

加载示例图像,并包它们已于科学分类。

import PIL
import numpy as np

img_path, _ = urlretrieve('http://www.anishathalye.com/media/2017/07/25/cat.jpg')
img_class = 281
img = PIL.Image.open(img_path)
big_dim = max(img.width, img.height)

wide = img.width > img.height
new_w = 299 if not wide else int(img.width * 299 / img.height)
new_h = 299 if wide else int(img.height * 299 / img.width)
img = img.resize((new_w, new_h)).crop((0, 0, 299, 299))
img = (np.asarray(img) / 255.0).astype(np.float32)

classify(img, correct_class=img_class)

对阵样本

吃得一个图像X,神经网络输出标签上的概率分布为P(y|X)。当手工制作对抗输入时,我们怀念使找到一个X’,使得logP(y’|X’)被最大化为目标标签y’,即输入将让错误分类为对象类。通过自律一些ℓ∞半径为ε的箱,要求‖X-
X’‖∞≤ε,我们好管X’与原始X看起不极端相同。
当此框架中,对抗样本是缓解一个约优化的问题,可以以反向传播和影子梯度下降来解决,基本上也是用同训练网络自一样之技巧。算法很粗略:
首先用对阵样本初始化为X’←X。然后,重复以下过程直到收敛:

1. X'←X^+α⋅∇logP(y'|X')

2. X'←clip(X',X - ε,X+ε)

初始化

先是由不过简单易行的一对开始:编写一个TensorFlow op进行对应的初始化。

x = tf.placeholder(tf.float32, (299, 299, 3))

x_hat = image # our trainable adversarial input
assign_op = tf.assign(x_hat, x)

梯度下降步骤

接通下,编写梯度下降步骤为最大化目标类的对准数概率(或顶小化交叉熵)。

learning_rate = tf.placeholder(tf.float32, ())
y_hat = tf.placeholder(tf.int32, ())

labels = tf.one_hot(y_hat, 1000)
loss = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=[labels])
optim_step = tf.train.GradientDescentOptimizer(
    learning_rate).minimize(loss, var_list=[x_hat])

影子步骤

末,编写投影步骤,使得对抗样本在视觉上和原来图像相似。另外,将那范围为[0,1]范围外保障有效的图像。

epsilon = tf.placeholder(tf.float32, ())

below = x - epsilon
above = x + epsilon
projected = tf.clip_by_value(tf.clip_by_value(x_hat, below, above), 0, 1)
with tf.control_dependencies([projected]):
    project_step = tf.assign(x_hat, projected)

执行

末尾,准备合成一个对阵样本。我们随便选取“鳄梨酱”(imagenet class
924)作为我们的对象类。

demo_epsilon = 2.0/255.0 # a really small perturbation
demo_lr = 1e-1
demo_steps = 100
demo_target = 924 # "guacamole"

# initialization step
sess.run(assign_op, feed_dict={x: img})

# projected gradient descent
for i in range(demo_steps):
    # gradient descent step
    _, loss_value = sess.run(
        [optim_step, loss],
        feed_dict={learning_rate: demo_lr, y_hat: demo_target})
    # project step
    sess.run(project_step, feed_dict={x: img, epsilon: demo_epsilon})
    if (i+1) % 10 == 0:
        print('step %d, loss=%g' % (i+1, loss_value))


adv = x_hat.eval() # retrieve the adversarial example
step 10, loss=4.18923
step 20, loss=0.580237
step 30, loss=0.0322334
step 40, loss=0.0209522
step 50, loss=0.0159688
step 60, loss=0.0134457
step 70, loss=0.0117799
step 80, loss=0.0105757
step 90, loss=0.00962179
step 100, loss=0.00886694

这种对抗图像以及原有图像在视觉及无法区分,没有可见的人工加工。但是其见面坐大高之票房价值分类也“鳄梨酱”。

classify(adv, correct_class=img_class, target_class=demo_target)

[图上传失败…(ima澳门1495ge-7a063e-1515921665436)]

鲁棒的对垒样本

当今来拘禁一个再尖端的例证。遵循我们的点子来合成稳健的势不两立样本,以搜寻到对猫图像的纯粹扰动,这当一些选择的易分布下又对抗,可以选取外可微分变换的遍布;在这篇文章被,我们以合成一个单一的对阵输入,设置θ∈[-
π/4,π/4],这对准旋转是鲁棒的。
以此起彼伏下的劳作前,检查一下之前的例证是否会对抗旋转,比如说设置角度为θ=π/8。

ex_angle = np.pi/8

angle = tf.placeholder(tf.float32, ())
rotated_image = tf.contrib.image.rotate(image, angle)
rotated_example = rotated_image.eval(feed_dict={image: adv, angle: ex_angle})
classify(rotated_example, correct_class=img_class, target_class=demo_target)

关押起我们前生成的胶着样本不是转不换的!
这就是说,如何让一个相持样本对换的分布是鲁棒的也罢?给得一些变换分布T,我们好最大化Et~TlogP(y’|t(X’)),约束规范为‖X-
X’‖∞≤ε。可以经过投影梯度下降法来解决这个优化问题,注意到∇EtTlogP(y’|t(X’))与EtT∇logP(y’|t(X’))相等,并在每个梯度下降步骤中来逼样本。
可使用一个技艺让TensorFlow为咱成功就或多或少,而休是通过手动实现梯度采样得到:我们得以如法炮制基于采样的梯度下降,作为自由分类器的集纳中的梯度下降,随机分类器从遍布着随意抽取并当分拣之前变换输入。

num_samples = 10
average_loss = 0
for i in range(num_samples):
    rotated = tf.contrib.image.rotate(
        image, tf.random_uniform((), minval=-np.pi/4, maxval=np.pi/4))
    rotated_logits, _ = inception(rotated, reuse=True)
    average_loss += tf.nn.softmax_cross_entropy_with_logits(
        logits=rotated_logits, labels=labels) / num_samples

我们可以重复使用assign_op和project_step,但为这个新目标,必须写一个新的optim_step。

optim_step = tf.train.GradientDescentOptimizer(
    learning_rate).minimize(average_loss, var_list=[x_hat])

末段,我们准备运行PGD来起对立输入。和前面的例子一样,选择“鳄梨酱”作为我们的靶子类。

demo_epsilon = 8.0/255.0 # still a pretty small perturbation
demo_lr = 2e-1
demo_steps = 300
demo_target = 924 # "guacamole"

# initialization step
sess.run(assign_op, feed_dict={x: img})

# projected gradient descent
for i in range(demo_steps):
    # gradient descent step
    _, loss_value = sess.run(
        [optim_step, average_loss],
        feed_dict={learning_rate: demo_lr, y_hat: demo_target})
    # project step
    sess.run(project_step, feed_dict={x: img, epsilon: demo_epsilon})
    if (i+1) % 50 == 0:
        print('step %d, loss=%g' % (i+1, loss_value))


adv_robust = x_hat.eval() # retrieve the adversarial example
step 50, loss=0.0804289
step 100, loss=0.0270499
step 150, loss=0.00771527
step 200, loss=0.00350717
step 250, loss=0.00656128
step 300, loss=0.00226182

这种对抗图像被高度信任地归类为“鳄梨酱”,即使是转的状况下!

rotated_example = rotated_image.eval(feed_dict={image: adv_robust, angle: ex_angle})
classify(rotated_example, correct_class=img_class, target_class=demo_target)

[图表及传失败…(image-c6194d-1515921665436)]

脚来拘禁一下每当全体角度范围外出的鲁棒对抗样本的团团转不变性,看P(y’|x’)在θ∈[-
π/4,π/4]。

thetas = np.linspace(-np.pi/4, np.pi/4, 301)

p_naive = []
p_robust = []
for theta in thetas:
    rotated = rotated_image.eval(feed_dict={image: adv_robust, angle: theta})
    p_robust.append(probs.eval(feed_dict={image: rotated})[0][demo_target])

    rotated = rotated_image.eval(feed_dict={image: adv, angle: theta})
    p_naive.append(probs.eval(feed_dict={image: rotated})[0][demo_target])

robust_line, = plt.plot(thetas, p_robust, color='b', linewidth=2, label='robust')
naive_line, = plt.plot(thetas, p_naive, color='r', linewidth=2, label='naive')
plt.ylim([0, 1.05])
plt.xlabel('rotation angle')
plt.ylabel('target class probability')
plt.legend(handles=[robust_line, naive_line], loc='lower right')
plt.show()

[图上传失败…(image-90a84f-1515921665436)]

从今图备受蓝色曲线可以看出,生成的势不两立样本是超级有效的。

标签:, , ,

Your Comments

近期评论

    功能


    网站地图xml地图