Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

亲耳“听见”神经网络的声音:梯度变化一听即可辨别(附代码)

新智元(ID:AI_era) 2019-08-05 14:49:00 阅读数:9 评论数:0 点赞数:0 收藏数:0

  来源:Reddit 等  编辑:金磊、鹏飞

  【新智元导读】训练神经网络可以用听的!Reddit 网友做了一个非常有趣的实验:将每个神经网络层梯度范式转换成了一个音调,这样人类就可以凭借听觉,来很好的分辨出非常小的干扰,比如节奏和音调。

  训练神经网络还可以用“听”的!

  网友做了一个非常有趣的实验:将每个神经网络层梯度范式转换成了一个音调,这样人类就可以凭借听觉,来很好的分辨出非常小的干扰,比如节奏和音调。

  以往,我们在训练神经网络的时候,通常会测量许多不同的指标,例如精度、损失以及梯度等等。这些工作大部分是在 TensorBoard 上聚合上述度量指标并且绘制可视化。

  但除了视觉之外,有 Reddit 网友提出:用听觉也可以监控神经网络的训练

  博客地址:

  http://blog.christianperone.com/2019/08/listening-to-the-neural-network-gradient-norms-during-training/

  声音是目前神经网络训练中研究较少的一个方向。人类的听觉可以很好的分辨出非常小的干扰(即使这些干扰时间很短或很细微),比如节奏和音高。

  在这个实验中,研究者做了一个非常简单的例子,显示了使用每层的梯度范数进行的合成声音,以及使用不同设置(如不同学习率、优化器,动量等)对 MNIST 进行卷积神经网络训练的步骤等。

  看到这个结果,Reddit 网友嗨了,纷纷开发脑洞。

  MLApprentice

这真太了不起了。我一直在寻找直观体验渐变的方法,我觉得只看直方图时很难注意到训练模式。你有没有想过用图层深度来控制音高并使用音量来表示规范呢?这样我们光靠听音高就能知道是第几层了。

  klaysDoodle

10 层网络以后,我聋了

  MLApprentice

楼上你太搞笑了。你可以将深度标准化,使其保持在人类听觉范围内就可以。

  gohu_cd

很有意思!我想知道这是否有助于调试神经网络训练。因为其中存在不同的加权损失,甚至是对抗的(例如 GAN)。因为视觉和听觉都是感官,查看图表或听觉声音应该具有相同数量的信息。可以用对应于加权梯度的所有声音创建一个“交响乐”,也许这对于确定每个损失的正确权重是有用的。

  在下文给出的实验中,你需要安装 PyAudio 和 PyTorch 来运行代码。

  一、“听见”神经网络的声音

  如下训练神经网络的声音可跳转至下方链接听:

  http://blog.christianperone.com/2019/08/listening-to-the-neural-network-gradient-norms-during-training/  

  用 LR 0.01 和 SGD 训练声音

  下面这个音频片段表示在第一个 epoch 的前 200 步中使用 4 个层的梯度,并使用 10 个 batche 大小的训练会话。音高越高,一个神经网络层的标准值就越高,不同的 batche 之间会有短暂的静音。

  用 LR 0.1 的 SGD 训练声音

  同上,但是学习率更高了。

  用 LR 1.0 的 SGD 训练声音

  同上,但是随着学习率的提高,神经网络产生发散(diverge)。

  用 LR 1.0、BS 256 的 SGD 训练声音

  设置是相同的,但是学习率高达 1.0,batche 大小为 256。

  用 LR 0.01 的 Adam 训练声音

  与 SGD 的设置相同,但使用的是 Adam。

  二、源代码展示

  以下是实验的全部源代码,有兴趣的读者可以上手试一下。

  1 import pyaudio
  2 import numpy as np
  3 import wave
  
  5 import torch
  6 import torch.nn as nn
  7 import torch.nn.functional as F
  8 import torch.optim as optim
  9 from torchvision import datasets, transforms
 
 
 12 class Net (nn.Module):
     def __init__(self):
         super (Net, self).__init__()
         self.conv1 = nn.Conv2d (, , , )
         self.conv2 = nn.Conv2d (, , , )
         self.fc1 = nn.Linear (**, )
         self.fc2 = nn.Linear (, )
 
         self.ordered_layers = [self.conv1,
                                self.conv2,
                                self.fc1,
                                self.fc2]
 
     def forward (self, x):
         x = F.relu (self.conv1(x))
         x = F.max_pool2d (x, , )
         x = F.relu (self.conv2(x))
         x = F.max_pool2d (x, , )
         x = x.view (-, **)
         x = F.relu (self.fc1(x))
         x = self.fc2(x)
         return F.log_softmax (x, dim=)
 
 
 36 def open_stream (fs):
     p = pyaudio.PyAudio ()
     stream = p.open (format=pyaudio.paFloat32,
                     channels=,
                     rate=fs,
                     output=True)
     return p, stream
 
 
 45 def generate_tone (fs, freq, duration):
     npsin = np.sin ( * np.pi * np.arange (fs*duration) * freq / fs)
     samples = npsin.astype (np.float32)
     return 0.1 * samples
 
 
 51 def train (model, device, train_loader, optimizer, epoch):
     model.train ()
 
     fs = 
     duration = 0.01
     f = 200.0
     p, stream = open_stream (fs)
 
     frames = []
 
     for batch_idx, (data, target) in enumerate (train_loader):
         data, target = data.to (device), target.to (device)
         optimizer.zero_grad ()
         output = model (data)
         loss = F.nll_loss (output, target)
         loss.backward ()
 
         norms = []
         for layer in model.ordered_layers:
             norm_grad = layer.weight.grad.norm ()
             norms.append (norm_grad)
 
             tone = f + ((norm_grad.numpy ()) * 100.0)
             tone = tone.astype (np.float32)
             samples = generate_tone (fs, tone, duration)
 
             frames.append (samples)
 
         silence = np.zeros (samples.shape[] * ,
                            dtype=np.float32)
         frames.append (silence)
 
         optimizer.step ()
 
         # Just  steps per epoach
         if batch_idx == :
             break
 
     wf = wave.open ("sgd_lr_1_0_bs256.wav", 'wb')
     wf.setnchannels ()
     wf.setsampwidth (p.get_sample_size (pyaudio.paFloat32))
     wf.setframerate (fs)
     wf.writeframes (b''.join (frames))
     wf.close ()
 
     stream.stop_stream ()
     stream.close ()
     p.terminate ()
 

101 def run_main ():
    device = torch.device ("cpu")

    train_loader = torch.utils.data.DataLoader (
        datasets.MNIST ('../data', train=True, download=True,
                       transform=transforms.Compose ([
                           transforms.ToTensor (),
                           transforms.Normalize ((0.1307,), (0.3081,))
                       ])),
        batch_size=, shuffle=True)

    model = Net () .to (device)
    optimizer = optim.SGD (model.parameters (), lr=0.01, momentum=0.5)

    for epoch in range (, ):
        train (model, device, train_loader, optimizer, epoch)


119 if __name__ == "__main__":
    run_main ()

  Reddit 地址:

  https://www.reddit.com/r/MachineLearning/comments/clyzgx/p_listening_to_the_neural_network_gradient_norms/

  博客:

  http://blog.christianperone.com/2019/08/listening-to-the-neural-network-gradient-norms-during-training/

版权声明
本文为[新智元(ID:AI_era)]所创,转载请带上原文链接,感谢
https://news.cnblogs.com/n/629213/