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

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

新智元报道

来源: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。

源代码展示

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

  1import pyaudio
  2import numpy as np
  3import wave
  4
  5import torch
  6import torch.nn as nn
  7import torch.nn.functional as F
  8import torch.optim as optim
  9from torchvision import datasets, transforms
 10
 11
 12class Net(nn.Module):
 13    def __init__(self):
 14        super(Net, self).__init__()
 15        self.conv1 = nn.Conv2d(1, 20, 5, 1)
 16        self.conv2 = nn.Conv2d(20, 50, 5, 1)
 17        self.fc1 = nn.Linear(4*4*50, 500)
 18        self.fc2 = nn.Linear(500, 10)
 19
 20        self.ordered_layers = [self.conv1,
 21                               self.conv2,
 22                               self.fc1,
 23                               self.fc2]
 24
 25    def forward(self, x):
 26        x = F.relu(self.conv1(x))
 27        x = F.max_pool2d(x, 2, 2)
 28        x = F.relu(self.conv2(x))
 29        x = F.max_pool2d(x, 2, 2)
 30        x = x.view(-1, 4*4*50)
 31        x = F.relu(self.fc1(x))
 32        x = self.fc2(x)
 33        return F.log_softmax(x, dim=1)
 34
 35
 36def open_stream(fs):
 37    p = pyaudio.PyAudio()
 38    stream = p.open(format=pyaudio.paFloat32,
 39                    channels=1,
 40                    rate=fs,
 41                    output=True)
 42    return p, stream
 43
 44
 45def generate_tone(fs, freq, duration):
 46    npsin = np.sin(2 * np.pi * np.arange(fs*duration) * freq / fs)
 47    samples = npsin.astype(np.float32)
 48    return 0.1 * samples
 49
 50
 51def train(model, device, train_loader, optimizer, epoch):
 52    model.train()
 53
 54    fs = 44100
 55    duration = 0.01
 56    f = 200.0
 57    p, stream = open_stream(fs)
 58
 59    frames = []
 60
 61    for batch_idx, (data, target) in enumerate(train_loader):
 62        data, target = data.to(device), target.to(device)
 63        optimizer.zero_grad()
 64        output = model(data)
 65        loss = F.nll_loss(output, target)
 66        loss.backward()
 67
 68        norms = []
 69        for layer in model.ordered_layers:
 70            norm_grad = layer.weight.grad.norm()
 71            norms.append(norm_grad)
 72
 73            tone = f + ((norm_grad.numpy()) * 100.0)
 74            tone = tone.astype(np.float32)
 75            samples = generate_tone(fs, tone, duration)
 76
 77            frames.append(samples)
 78
 79        silence = np.zeros(samples.shape[0] * 2,
 80                           dtype=np.float32)
 81        frames.append(silence)
 82
 83        optimizer.step()
 84
 85        # Just 200 steps per epoach
 86        if batch_idx == 200:
 87            break
 88
 89    wf = wave.open("sgd_lr_1_0_bs256.wav", 'wb')
 90    wf.setnchannels(1)
 91    wf.setsampwidth(p.get_sample_size(pyaudio.paFloat32))
 92    wf.setframerate(fs)
 93    wf.writeframes(b''.join(frames))
 94    wf.close()
 95
 96    stream.stop_stream()
 97    stream.close()
 98    p.terminate()
 99
100
101def run_main():
102    device = torch.device("cpu")
103
104    train_loader = torch.utils.data.DataLoader(
105        datasets.MNIST('../data', train=True, download=True,
106                       transform=transforms.Compose([
107                           transforms.ToTensor(),
108                           transforms.Normalize((0.1307,), (0.3081,))
109                       ])),
110        batch_size=256, shuffle=True)
111
112    model = Net().to(device)
113    optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)
114
115    for epoch in range(1, 2):
116        train(model, device, train_loader, optimizer, epoch)
117
118
119if __name__ == "__main__":
120    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/

本文分享自微信公众号 - 新智元(AI_era)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 自学机器学习,怎么才能找到工作啊?至少要避开十大雷区 | Reddit高热

    一个叫做AdditionalWay的网友,在Reddit提出了这个直击灵魂的问题,引发了大量讨论,两天热度已经超过500。

    量子位
  • 微软10亿美元砸入OpenAI:明为AGI,暗争谷歌,被指云计算换投资

    10亿美元,投向知名AI研究机构OpenAI,同时双方达成一项多年合作协议——OpenAI接下来会在微软Azure云平台开发AI技术。

    量子位
  • 谷歌2019学术影响力新榜:CVPR跃升总榜前10,工程与计算机第2

    榜单地址:https://scholar.google.com/citations?view_op=top_venues&hl=en

    机器之心
  • 业界首个视频识别与定位工具集PaddleVideo重磅更新,前沿视频模型等你用

    PaddleVideo 在实际工业界可以形成很多具体应用,包括:视频精彩片段预测、关键镜头定位、视频剪辑等任务,例如定位 NBA 篮球赛视频中扣篮镜头,电视剧中...

    机器之心
  • K- 近邻算法

    K-近邻算法实现&python中k-近邻算法使用&模型评估

    俺也想起舞
  • 对于AI的未来,我们需要保持谨慎乐观:市北·GMIS 2019首日全亮点

    本届大会以「拥抱数智经济,赋能产业生态」为主题,聚焦人工智能学术研究、工程技术与产业应用。「由大数据、人工智能引领的科技革命方兴未艾,正对社会正产生着深远的影响...

    机器之心
  • 加速时光,让你永远70岁的「变老神器」FaceAPP突然爆红,却恐遭美国封杀

    这款应用使用 AI 算法,可以瞬间把人们上传的人脸照片「年轻」或者「老化」。它就是这几天网上充斥各界明星 17 岁/80 岁照片的万恶之源。

    小小詹同学
  • 免费GPU计算资源哪里有?带你薅薅国内GPU羊毛

    之前有专门教程介绍谷歌资源,需要科学上网。但最近知乎上又有一套国产GPU资源的薅羊毛分享,价值上亿的高性能算力,对科研学习者完全免费。

    量子位
  • 百度深度学习平台飞桨:中国科技自主的AI秘密武器

    海量的论文出现在国际顶尖AI学术会议,各种AI商业化实践受到全世界认可。在AI这一赛道上,中国已经颇具底气。然而,AI既然是推动世界第四次工业革命的“发动机”,...

    罗超频道
  • MIT用超导体制成极低功耗神经元,能效接近人类大脑,比计算机高4个量级

    计算机越来越智能,但是智能的算法却需要大量的资源。一台计算机以GHz的频率运行,功耗上千瓦。而人类的大脑运行速率比电脑慢几百万倍,只有约20W的功率,却能轻松做...

    量子位

扫码关注云+社区

领取腾讯云代金券