親耳「聽見」神經網絡的聲音:梯度變化一聽即可辨別(附代碼)

2021-03-02 新智元

【新智元導讀】訓練神經網絡可以用聽的!Reddit網友做了一個非常有趣的實驗:將每個神經網絡層梯度範式轉換成了一個音調,這樣人類就可以憑藉聽覺,來很好的分辨出非常小的幹擾,比如節奏和音調。

訓練神經網絡還可以用「聽」的!

網友做了一個非常有趣的實驗:將每個神經網絡層梯度範式轉換成了一個音調,這樣人類就可以憑藉聽覺,來很好的分辨出非常小的幹擾,比如節奏和音調。

以往,我們在訓練神經網絡的時候,通常會測量許多不同的指標,例如精度、損失以及梯度等等。這些工作大部分是在TensorBoard上聚合上述度量指標並且繪製可視化。

但除了視覺之外,有Reddit網友提出:用聽覺也可以監控神經網絡的訓練

博客地址:

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

聲音是目前神經網絡訓練中研究較少的一個方向。人類的聽覺可以很好的分辨出非常小的幹擾(即使這些幹擾時間很短或很細微),比如節奏和音高。

在這個實驗中,研究者做了一個非常簡單的例子,顯示了使用每層的梯度範數進行的合成聲音,以及使用不同設置(如不同學習率、優化器,動量等)對MNIST進行卷積神經網絡訓練的步驟等。

看到這個結果,Reddit網友嗨了,紛紛開發腦洞。

MLApprentice

這真太了不起了。我一直在尋找直觀體驗漸變的方法,我覺得只看直方圖時很難注意到訓練模式。你有沒有想過用圖層深度來控制音高並使用音量來表示規範呢?這樣我們光靠聽音高就能知道是第幾層了。

klaysDoodle

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        
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/

相關焦點

  • 直接對梯度下手,阿里提出新型優化技巧,一行代碼即可改善現有優化器
    比如批歸一化、權重標準化……但現有的優化方法大多基於激活或權重執行,最近阿里達摩院的研究者另闢蹊徑,直接對梯度下手,提出全新的梯度中心化方法。只需一行代碼即可嵌入現有的 DNN 優化器中,還可以直接對預訓練模型進行微調。優化技術對於深度神經網絡 (DNN) 的高效訓練至關重要。
  • 乾貨分享|使用JAX創建神經網絡的對抗性示例(附詳細代碼)
    在本教程中,我們將看到如何創建使用JAX訓練神經網絡的對抗示例。首先,讓我們看一些定義。有哪些例子?簡而言之,對抗性示例是神經網絡的輸入,這些輸入經過優化以欺騙算法,即導致目標變量分類錯誤。通過向目標變量添加「適當的」噪聲,我們可以對目標變量進行錯誤分類。下圖演示了該概念。
  • 訓練深度神經網絡失敗的罪魁禍首不是梯度消失,而是退化
    在這篇文章中,我將指出一個常見的關於訓練深度神經網絡的困難的誤解。人們通常認為這種困難主要是(如果不全是)由於梯度消失問題(和/或梯度爆炸問題)。「梯度消失」指的是隨著網絡深度增加,參數的梯度範數指數式減小的現象。梯度很小,意味著參數的變化很緩慢,從而使得學習過程停滯,直到梯度變得足夠大,而這通常需要指數量級的時間。
  • BP神經網絡
    上篇劍客對神經網絡做了科普,還記得嘛神經網絡是長這個樣子的  運行方式模擬人類神經系統,它由輸入層→隱藏層→
  • 「臺灣聲音地圖」帶你聽見臺灣
    如果你曾經透過上帝視角,看見寶島的美景,重溫了對這塊土地的回憶而被觸動,你肯定要花點時間打開「臺灣聲音地圖」,親耳體驗「聽見臺灣」的純粹感動!   有感於「聲音感知」總是被忙碌的人們所忽略,臺灣藝術家吳燦政自2010年起,啟動為期六年的「臺灣聲音地圖」計劃。他將臺灣分為五大區塊,逐一採集錄製全臺灣各地的聲音。聲音來源何其多,而吳燦政選擇以特殊聲音事件或生活物件作為錄音記錄對象,行有餘力時他還會利用時間機會重複到訪已經錄製過的地區縣市,再次進行錄音採集,儘可能地呈現聲音的內容在時空變化過程中的差異與現象。
  • 【乾貨】這8種神經網絡結構,你掌握了幾個?
    我們不知道要怎麼寫代碼來解決這個問題,因為我們不知道這個識別過程是如何在我們的大腦中完成的。 即使我們知道該怎麼做,要編寫的程序可能會非常複雜。另外,通過寫程序來判別一個信用卡交易屬於詐騙的概率也是很難的。因為這沒有任何簡單可靠的規則指導編程,我們需要結合大量的弱規則。 因為欺詐是一個動態的目標,程序也需要不斷變化。
  • 超酷的神經網絡合成動物運動動畫,解救動畫師!(代碼開源+視頻)
    」的新神經網絡架構,它可以從實際的運動數據學習,生成非常自然的動畫。團隊在今天開源了所有代碼、數據和編譯的demo。開源地址:https://github.com/sebastianstarke/AI4Animation
  • 硬剛無限寬神經網絡後,谷歌大腦有了12個新發現
    也許會有人說相比寬度而言,神經網絡更需要深度來支持表達性,從一些經典神經網絡的發展歷程即可看出。 當中間層無限寬時,很大一類貝葉斯網絡和以梯度下降訓練的神經網絡最後都會收斂到高斯過程(GPs)或與其密切相關的核方法。
  • 聽見花開的聲音……
    初春,聽見花開的聲音,我在日佳柏萊遇到你.......腳步匆匆的你,可聽見這來自春暖花開的奇妙梵音?請停下腳步,聽一聽四季流動走動的聲音,聽一聽時光划過天際的腳步,聽一聽花蕾綻放美麗的旋律。花開旖旎多嫵媚,莫待無花空嘆惋。
  • 谷歌大腦發布神經網絡的「核磁共振」,並公開相關代碼
    傳統的嘗試進行可解釋性研究的方法是通過查看網絡中哪個神經元被激發來來理解,但是即使我們知道「第538號神經元被激發了一點點」也毫無意義,並不能幫助我們理解神經元在網絡中的意義。為了解決這樣的問題 Google Brain的一些研究人員開發了神經網絡特徵可視化方法。2015 年上半年的時候,谷歌大腦的人員就嘗試將神經網絡理解圖像並生成圖像的過程進行可視化。
  • 又是神經網絡!還能用來盜取XX女演員信息
    來源:煎蛋網四月初,名為Egor Tsvetkov的俄羅斯攝影師利用照片和應用程式FindFace(能利用面部識別將社交媒體帳戶信息與照片聯繫起來的神經網絡
  • 10個梯度下降優化算法+備忘單
    梯度下降是一種尋找函數極小值的優化方法,在深度學習模型中常常用來在反向傳播過程中更新神經網絡的權值。在一個線性回歸問題中,我已經用梯度下降實現了SGD, momentum, Nesterov, RMSprop 以及Adam,獲取代碼(JavaScript)通過梯度下降,優化算法可以在如下三個主要方面起作用:1、修改學習率成分,α, 或2、修改梯度成分 ∂L/∂w3、或二者兼有且看如下方程1:
  • 詳解深度強化學習展現TensorFlow 2.0新特性(代碼)
    策略梯度(Policy Gradient)方法通過調整其參數直接優化策略本身,通常是通過梯度下降。完全計算梯度通常是很困難的,所以通常用蒙特卡洛(monte-carlo)方法來估計梯度。最流行的方法是二者的混合:actor- critical方法,其中智能體策略通過「策略梯度」進行優化,而基於值的方法則用作期望值估計的引導。
  • 教程| 如何使用TensorFlow構建、訓練和改進循環神經網絡
    目前有很多人工智慧應用都依賴於循環深度神經網絡,在谷歌(語音搜索)、百度(DeepSpeech)和亞馬遜的產品中都能看到RNN的身影。然而,當我們開始著手構建自己的 RNN 模型時,我們發現在使用神經網絡處理語音識別這樣的任務上,幾乎沒有簡單直接的先例可以遵循。
  • 通過分析梯度下降的軌跡
    該論文研究了深度線性神經網絡上梯度下降的情況,能保證以線性速率收斂到全局最小值。圖景(landscape)方法及其局限性很多有關深度學習優化的論文都隱含地假設:在建立了損失圖景(尤其是臨界點的損失圖景,臨界點是指梯度消失的點)的幾何性質之後,就會得到對其的嚴格理解。
  • 《聽見天堂》:聽一聽來自天堂的聲音
    聆聽著窗外大自然美妙的聲音,我的心情異常平靜,在左右踱步中,莫名想到了這部電影,分享給大家,願你們在這個周末能夠靜下心來聽聽來自窗外的聲音,而後安安靜靜的看一看這部電影。清晨坐在窗邊任憑微風吹入,心裡絲絲翻湧童年的過往。
  • SIGGRAPH 2018 | 自適應神經網絡模擬運動軌跡,四足動物旋轉跳躍...
    本期論文提出了一種用於四足運動合成的新型數據驅動方法,並稱之為自適應神經網絡。該系統可以實現,根據控制命令產生逼真的運動動畫和穩定的轉換過程。與傳統的關鍵幀動畫不同,這項系統不需要單獨創建動畫剪輯或動畫圖形,而是能夠直接通過數據學習這些動畫。由於四足動物的腳步類型複雜,標記運動模型通常需要專業知識和大量的數據來校準和預處理。
  • [舊文]我試著訓練了一下神經網絡來生成金庸小說
    準備工作我在這裡使用的深度學習的框架是Tensorflow,打算使用的神經網絡是Long short term memory (長短時記憶 LSTM) 加上recurrent neural network (循環神經網絡 RNN)的模型。
  • 什麼是人工神經網絡(ANN)?
    但是直到最近幾年,神經網絡的承諾才變為現實,並幫助AI行業擺脫了漫長的冬季。儘管神經網絡幫助AI取得了飛躍,但它們也常常被誤解。這時您需要了解的有關神經網絡的所有信息。人工和生物神經網絡之間的相似性人工智慧先驅的最初願景是複製人類大腦的功能,這是自然界最聰明,最複雜的已知創造。
  • 深度神經網絡推理時間的正確測量方法
    網絡延遲是將深度網絡部署到生產環境中要考慮的重要因素之一。大多數實際應用程式都需要非常快的推理時間,從幾毫秒到一秒不等。但是,正確而有意義地測量神經網絡的推理時間或延遲的任務需要對網絡有深刻的理解。即使是經驗豐富的程式設計師也經常會犯一些常見的錯誤,從而導致延遲測量不準確。這些錯誤有可能會引發錯誤的決策和不必要的支出。