1. 程式人生 > >演算法踩坑小記

演算法踩坑小記

經過前面研究影象演算法和近階段研究視訊和音訊演算法的經歷經驗.

在2019年快要來臨的時候,寫下這篇小記.

目的很簡單,總結過往,展望未來.

這裡列舉一些本人在演算法上踩過的坑和出坑思路.

 

主要是資料標準化問題.

 

1.臨界值問題  (最大值,最小值,閾值,無窮小,無窮大)

最早做一鍵修圖的時候,在這個坑上踩了太多次.

簡單描述就是,

(示例虛擬碼例子僅供理解思考參考,不具有實際意義)

1.1 梯度消失

 

如果一個演算法在計算過程中,存在最小值(無窮小,一般為0或接近0的數),

那就很可能出現"梯度消失"的問題.

例如:  

float weight = 0f; // (或 趨近於0)

float num = 255.0f;

float taget = num/weight;

這種問題最簡單的解法就是歸一化取值範圍, 

原來取值範圍是 0-255,歸一化為 1-256

或轉換到對數空間計算然後再轉回來.

 

1.2 梯度爆炸

反之,結果為最大值或者接近無窮大的數,甚至溢位有效範圍,那就可能出現"梯度爆炸"的問題.

例如:

int num1 = 255;
int num2 = 256;
unsigned char taget = num1-num2;
clamp 雖搓,但是簡單有效,
這個解決思路基本跟梯度消失是一個邏輯,歸一化.

1.3 閾值人為主義,非黑即白

採用閾值的做法,除非你清楚的知道你後續計算,

只有兩種明確情況,否則不要輕易使用閥值.

 int threshold = 127;

if ( num>threshold)

 taget = 0;

else

 taget = 1;

 

其實,這三個臨界值問題,熟悉深度學習的朋友,

可以類比一下啟用函式.

 

深度學習現有的啟用函式,其實並沒有很好解決臨界值問題,

只是採用規避的策略,降低臨界值事件的發生概率.

這裡不打算展開討論,流言止於智者.

 

2.資訊訊號屬性問題

多維空間與時序序列 的困局

2.1 多維空間

一般多維空間的問題在影象領域比較常見,當然音訊領域也有.

例如:

灰度,彩色,YUV空間等.

多維資料絕大多數情況是為了 "資訊互補","資訊壓縮".

也就是預計通過多個維度的資訊,互相補充作用,最終合成最佳的訊號.

這裡最常見的坑就是,多維資料的歸一化問題.

因為很有可能,RGB三個通道的顏色分佈並不完全一致,

這個時候你要融合RGB三個通道的資訊,

就必須考慮將資料歸一化到三個通道都適宜的取值範圍.

否則,最後合入時,就會出現上面提到的 臨界值問題.

基本上只要做好 臨界值的處理 就可以規避掉了.

例如影象領域做梯度金字塔融合時候,出現的暈輪效應或強邊緣溢色.

 

當然,還有一種特例,就是評估策略.

當你碰到一個問題,對一張彩色圖片,你只能用一個值來表達這張圖片的全域性情況.

一定要謹記,這個值的得出,必須所有資料參與計算.

不然就會犯多維資料的 閾值人為主義,非黑即白.

這個問題,當年設計一鍵修圖演算法的時候,就碰到過.

你怎麼判斷一張圖片的是否需要去霧.

區域性有霧或者全域性有霧,去霧係數的確認就是這種問題.

 

2.2 時序序列

時序序列除了 多維空間碰到的問題,它還有更加惱人的問題.

主要是音訊資料和文字語義資料的問題.

時序訊號最最最嚴重的問題就是時長和疊加.

也就是一句話的長短,一句話中重疊資料的多少,都有可能推翻所有.

例如:

在一起,好不好.

在一起,不好.

在一起,好.

時序問題絕大多數,資料中某個孤立的資料,反而是決定性因子.

這就有點像,

中國政府某年頒佈了什麼什麼條例.

某某行業消亡了.

時序訊號問題,真的就有點大海里去撈針.

 

由於近期一直在做音訊降噪演算法,

我就碰到這麼一根針.

音訊處理演算法三大問題,自動增益,噪聲抑制,回聲消除.

大家想一個問題,

如果一個數據連續出現,例如一段音樂.

你說,太小聲,我放大它,

結果你發現,這時不需要啊,有些音樂就是要漸隱漸現.

這個時候你會想說,好吧,那麼設定一個時長,超過就處理,不超過就不處理.

參見 臨界值問題,這種非黑即白,會死得很慘烈.

而噪聲和回聲,就剛才那幾句:

 

在一起,好不好.

在一起,不好.

在一起,好.

 

我就問一個問題,"好"出現了兩次,有沒有可能其中一個"好"是回聲.

第二個問題,第一個"好"是回聲,還是第二個"好"是回聲.

第三個問題,如果兩個"好"不是回聲,那它有沒有可能是噪聲.

 

這就是時序最讓人惱火的問題,因為 時序的長度是"模糊"的.

你說一句話停半秒,他說一句話停一秒.

 

這個問題可以稱之為,多維空間疊加的資料標準化困局.

 

更可怕的是,幾乎沒有任何標準和直接規律可言.

 

3.常識與自然規律

這個我要重點說一下,之前與不少科班出身的同事共事.

發現他們經常犯一些常識性錯誤.

舉個例子:  

A 是有限集合

B 是數學向量

C 是 A+B 的理論結果.

根據向量的定義,C應該也算是向量的一種表達.

好的問題來了,C的置信度有多少?

我相信大多數人都會發現問題,不在B和C而在A.

因為A是有限集合,它是確認的.

那麼C的置信度只能在A的區間範圍內,而不在它之外.

 

那麼,把上面這問題的變數稍微改動一下,

A是空間資料集合.

B是時序資料集合.

請問簡述C的置信度?

 

我就只能說,你沒有常識.

兩種不同維度的資料集合,在我有限的理解範圍內,

我只能將其定義為"噪"動不安.

 

也許這個時候,有某位大神跳出來,不對,

你們都不對,是你們資料量太小了.資料量大了,

就不會存在這個問題.

負分滾粗!

 

我就問,什麼量級的空間資料和什麼量級的時序資料,進行什麼量級的什麼計算,

可以達到相對平衡的穩態,或者說符合什麼樣的自然規律.

 

這個時候,又一個大神跳出來,廣義相對論和狹義相對論.

時間和空間的問題,就是時空的問題.

等你超越了了時間和空間也就是所謂的超時空,一切問題都不復存在了.

 

大神,請收下我的膝蓋,帶我裝逼帶我飛向超時空.

 

當然還有各種各樣的其他問題,當以不變應萬變.

以上僅僅為個人的心得體會,

若有出入,不要太過較真.

路漫漫其修遠兮.

以上,權當拋磚引玉.

 

關於本人自研的語音增強演算法的試用介面已經開放出來,

地址是http://47.98.140.120/

拖放wav 和 mp3即可試聽降噪前後的效果.

可能存在特定的wav和mp3由於解碼失敗問題導致失敗.

我會逐步完善的.

 

演算法現在是實時處理,

用在什麼硬體環境都毫無壓力.

效果還是不能到達我自己對它的要求.

主要還是沒能很好的解決時序疊加的問題,還有不少的坑要填.

 

2019年預計會陸續將以前做的一些影象演算法逐步梳理開源.

 

最後,祝大家新的一年,心想事成,美夢成真,好事成雙.

 

本人主要專注 音訊,影象,視訊演算法方向.

若有其他相關問題或者需求也可以郵件聯絡俺探討。

郵箱地址是: 
[email protected]