編碼不是AI調(diào)參數(shù):端到端可微壓縮如何重構視頻編碼)
“神經(jīng)編碼不是‘AI 調(diào)參數(shù)’這句話是我在跟不少做視頻云、轉(zhuǎn)碼引擎、編解碼研究的團隊聊完一圈后最想放到臺面上掰扯清楚的一個觀點。過去幾年AI 在視頻編碼里的主流存在感確實容易讓人產(chǎn)生“AI 就是給編碼器加個濾鏡、調(diào)幾個參數(shù)”的印象。但神經(jīng)編碼Neural Video Coding要做的不是給 H.266 錦上添花而是把“視頻壓縮”這件事本身重寫一遍編碼器是神經(jīng)網(wǎng)絡解碼器是神經(jīng)網(wǎng)絡碼率分配規(guī)則是神經(jīng)網(wǎng)絡連估計比特數(shù)的概率模型都是神經(jīng)網(wǎng)絡。這篇分享想解決三類人的困惑還在糾結(jié)要不要入局的編碼研發(fā)、被老板要求評估“AI 編碼器”的工程負責人、以及只是對下一代視頻技術感興趣的技術愛好者。你會看到神經(jīng)編碼和傳統(tǒng)編碼在原理本質(zhì)上的不同也會拿到一套可落地的評估思路和避坑清單。我會盡量把“為什么它不是調(diào)參數(shù)”這件事講透而不是堆結(jié)論。1. 為什么“AI 調(diào)參數(shù)”這個說法會流行起來1.1 前幾年AI在視頻編碼里確實只干了“換零件”的活如果只看 2018 到 2021 年之間的進展把 AI 和視頻編碼聯(lián)系起來最多的是三類工作用卷積網(wǎng)絡替換環(huán)路濾波里的 SAO/ALF 模塊用神經(jīng)網(wǎng)絡加速幀內(nèi)預測模式的選擇用強化學習做碼率控制。這些工作的共同點是編碼框架還是標準的混合編碼框架——塊劃分還在變換還在熵編碼還在。AI 是作為“增強單元”嵌入到某個環(huán)節(jié)訓練好網(wǎng)絡然后當作一個更好的零件裝進原有的流水線。這種做法有沒有價值有。通常能在同樣質(zhì)量下節(jié)省幾個百分點的碼率對老編碼器來說已經(jīng)是扎扎實實的進步。但問題也出在這里。大眾和大量工程師接觸到的“AI 編碼”基本都是這種形態(tài)于是形成一種思維慣性AI 再怎么厲害也就是把編碼器某個環(huán)節(jié)的參數(shù)、模式、濾波強度調(diào)得更好一點。這種慣性一旦形成等看到“神經(jīng)編碼”這個詞時很容易理解為“給編碼器加了更多 AI 參數(shù)”。這是誤讀的最大源頭。1.2 真正的神經(jīng)編碼動了整個編碼架構神經(jīng)編碼完全不是這個路子。一個典型的端到端神經(jīng)編碼器輸入是一幀或一組視頻幀輸出是一條壓縮碼流。中間發(fā)生了什么編碼器網(wǎng)絡把原始像素變成高維潛在表示量化后由熵模型估計概率并寫入碼流解碼器網(wǎng)絡再從潛在表示重建像素。這個鏈路里傳統(tǒng)視頻編碼最核心的那幾個手工模塊——幀內(nèi)預測、幀間預測、整數(shù)變換、去塊濾波、樣本自適應偏移——要么被網(wǎng)絡替代要么被重新定義為網(wǎng)絡的一部分。用“換零件”和“換架構”來對比更直白傳統(tǒng)編碼器是一臺運轉(zhuǎn)了幾十年的機床AI 增強是給機床換更好的刀具和傳感器神經(jīng)編碼則是把機床拆了重新設計了一臺從數(shù)據(jù)中學習加工路徑的數(shù)控設備。刀具還是那個刀具概念嗎不是了。所以“AI 調(diào)參數(shù)”這個詞用在神經(jīng)編碼上基本是南轅北轍。把這一層認知捋順后面講原理、講落地、講評估才有共同語言。2. 端到端可微壓縮神經(jīng)編碼的工作原理到底改了什么2.1 傳統(tǒng)編碼器是一本“手工規(guī)則手冊”傳統(tǒng)編碼器的設計哲學是把視頻壓縮拆成一系列可解釋的步驟每一步由標準委員會和工程師手工設計好規(guī)則。H.264 到 H.265 再到 H.266 的演進本質(zhì)是在同一套塊混合編碼框架里把規(guī)則做得更細、模式做得更多、預測做得更準。QP 控制了量化步長RDO 在這個離散參數(shù)空間里搜索最優(yōu)模式。編碼器參數(shù)多達幾十上百個但它們的作用范圍是被標準凍結(jié)了的增益上限也在凍結(jié)那一刻就鎖定了。打個直觀比方傳統(tǒng)編碼器像一本維修手冊手冊上寫滿了“遇到什么內(nèi)容用什么模式、大概分配多少比特”的規(guī)則。編碼時就是在手冊的框架里做查表、搜索、優(yōu)化。手冊寫得好不好直接決定壓縮效率而手冊本身是人力寫出來的。這也是為什么視頻編碼標準更新迭代慢因為它本質(zhì)是幾十個國家、幾百位工程師對一個固定解空間做層層打磨每提升 5% 都要花掉好幾年。2.2 神經(jīng)編碼器是一套可學習的壓縮策略神經(jīng)編碼的核心是把“壓縮”建模成一個端到端的可微系統(tǒng)。以最經(jīng)典的自動編碼器結(jié)構為例編碼器網(wǎng)絡 f 把輸入幀 x 映射成潛在表示 y量化器把 y 變成離散值熵模型根據(jù)概率 p(?) 對離散值編碼解碼器網(wǎng)絡 g 把離散潛在表示重建回視頻幀。訓練時優(yōu)化的目標不是某個模塊的局部精度而是整條鏈路的率失真損失 L R λD。這個公式里的 R 不是事后統(tǒng)計的比特數(shù)而是熵模型預測出的比特數(shù)R -log2 p(?)D 是重建失真可以用 MSE、MS-SSIM 或感知損失。λ 是訓練時的超參控制“省碼率”和“保質(zhì)量”的偏好。整套系統(tǒng)在大規(guī)模視頻數(shù)據(jù)上用梯度下降來訓練一次訓練完成推理階段不需要人為干預每個塊的模式選擇。所以你在神經(jīng)編碼里找不到“QP 調(diào)多少、參考幀用幾個、運動搜索范圍設多大”這種參數(shù)。訓練時的 λ、網(wǎng)絡結(jié)構、學習率才是真正要調(diào)的東西這是“調(diào)模型”和“調(diào)參數(shù)”的本質(zhì)區(qū)別。2.3 熵模型和超先驗連概率表都是學出來的傳統(tǒng)熵編碼比如 CABAC有固定的上下文建模規(guī)則概率表是標準寫好的。神經(jīng)編碼的熵模型是一個神經(jīng)網(wǎng)絡它可以依據(jù)潛在表示的統(tǒng)計特性動態(tài)估計每一個離散符號出現(xiàn)的概率。為了讓這個估計更準確常見做法是引入超先驗hyperprior編碼端先把潛在表示 y 的統(tǒng)計特征提出來壓縮成邊信息 z 發(fā)送過去解碼端用 z 來預測 y 的概率分布。這等于把“如何分配碼率”這件事也變成了可學習的模塊。我之前跟團隊交流時總是強調(diào)傳統(tǒng)編碼是“人寫規(guī)則機器執(zhí)行規(guī)則”神經(jīng)編碼是“機器從數(shù)據(jù)里學規(guī)則再用學到的規(guī)則去壓縮新數(shù)據(jù)”。這個區(qū)別不是調(diào)參精度的差異而是兩個層次的問題。理解了這一點你就能明白為什么換個領域比如從自然視頻切到醫(yī)學影像時傳統(tǒng)編碼器不需要重訓練但神經(jīng)編碼器通常需要用新數(shù)據(jù)微調(diào)也就能明白為什么神經(jīng)編碼的靈活性高但工程復雜度也隨之上升。3. 范式轉(zhuǎn)移之后工程側(cè)首先面對的三個連鎖變化3.1 部署神經(jīng)編碼器本質(zhì)是運維一個推理系統(tǒng)傳統(tǒng)編碼器是純 CPU 上跑的算法調(diào)參、優(yōu)化、部署的路徑非常成熟。神經(jīng)編碼器不同你的編碼端和解碼端都是神經(jīng)網(wǎng)絡部署時你面對的是模型加載、GPU 推理、算子適配、顯存管理這一整套推理問題。我第一次把一個神經(jīng)視頻模型搬到服務端時最直觀的沖擊就是編碼一幀的延遲不是算出來多少毫秒的問題而是要考慮模型前向、超先驗分支、量化反量化這些環(huán)節(jié)在硬件上的實際耗時。720p 還好1080p 以上顯存和時延突然就變得很敏感。如果團隊自己訓練模型還要面對訓練資源。率失真端到端訓練和傳統(tǒng)編碼器開發(fā)完全是兩套技能樹一個偏機器學習系統(tǒng)工程一個偏信號處理和標準實現(xiàn)。很多團隊試點了一個月回來跟我說“跑不動”都不是說效果不行而是整個工具鏈的運維習慣沒切換過來。以前優(yōu)化一個編碼器改配置文件、調(diào)參考幀、換搜索算法就行現(xiàn)在優(yōu)化一個神經(jīng)編碼器要管數(shù)據(jù)管道、模型版本、推理框架、量化精度復雜度完全是另一個量級。3.2 碼率控制的思路完全反過來了傳統(tǒng)編碼器的碼率控制是反饋控制看著緩沖區(qū)動態(tài)調(diào) QP讓輸出碼率貼近目標。神經(jīng)編碼器沒有傳統(tǒng)意義上可調(diào)的 QP。你是在訓練階段用不同的 λ 訓練出不同碼率檔位的模型推理時按業(yè)務碼率目標選模型或者設計一個可調(diào)節(jié)的潛在特征縮放模塊通過縮放因子近似碼率變化。這意味著什么目標碼率的精確控制能力會明顯變?nèi)?。我實測過一些開源模型在某一個碼率點附近輸出波動 ±10% 并不稀奇而 x265 基本可以做到貼近目標碼率。如果業(yè)務是固定帶寬的直播鏈路這個波動會直接影響緩沖和卡頓。不是說神經(jīng)編碼做不到精確碼率控制而是當前技術路線天然更擅長“大致控制、按內(nèi)容自適應分配碼率”這種思路更適合 VOD 和海量內(nèi)容壓縮而不是硬實時鏈路。團隊在立項之前最好先問清楚業(yè)務端對碼率精度的容忍度到底是多少。3.3 失真形態(tài)變了主觀質(zhì)量評測不能只看PSNR傳統(tǒng)編碼的失真大多表現(xiàn)為塊效應、振鈴、模糊這些可以通過濾波削弱。神經(jīng)編碼訓練出的模型失真是由“數(shù)據(jù)分布”決定的草地、樹葉、頭發(fā)這類高頻紋理很容易被模型重建得過度平滑看起來“糊”反過來用對抗式損失訓練出來的模型有時會憑空生成看起來合理但并非原圖的細節(jié)也就是“編造紋理”。所以單純比較 PSNR 是危險的。一個模型 PSNR 高不代表主觀觀感好一個模型 PSNR 低可能因為細節(jié)重建策略不同人眼看卻很舒服。我現(xiàn)在的評估流程是 PSNR、MS-SSIM、VMAF 三個指標一起出再抽幀讓真實的人看。神經(jīng)編碼尤其要用偏主觀的指標去評價否則很容易練出一個“數(shù)值漂亮、觀感拉胯”的模型。這個教訓我在第一次評估生成式編碼方案時就吃過只看 PSNR 結(jié)論是大幅領先人眼一放進測試集馬上翻車。4. 實操評估如何科學地對比神經(jīng)編碼與傳統(tǒng)編碼器4.1 把傳統(tǒng)基準擺對位置評估才算開始評估的常見錯誤是拿神經(jīng)編碼的一份測試結(jié)果跟別人論文里的 x265 數(shù)字比碼率點還不一致。正確做法是同一批測試序列、同一套編碼設置把傳統(tǒng)基準自己跑出來。序列選擇上公開的 UVG、HEVC Class B/C/D/E、MCL-JCV 都可以用把 4K、1080p、720p 都覆蓋到如果業(yè)務是監(jiān)控、屏幕錄制、醫(yī)學影像一定要加入代表性私有樣本這比公開序列更能說明問題。傳統(tǒng)基準建議用 x265 或者最新參考軟件比如 VTM跑多檔預設至少產(chǎn)出 6 個碼率點。神經(jīng)編碼這邊也要在相近碼率范圍產(chǎn)出同等數(shù)量的點兩邊都算 PSNR、MS-SSIM、VMAF畫出率失真曲線再比較。孤立地說“我的模型比某個編碼器省多少碼率”是沒有意義的必須在同一坐標系里比。我在實際評估中最常用的一組碼率點是 0.5、1.0、1.5、2.0、3.0、4.0 Mbps 左右覆蓋低碼率到中等碼率基本能看出曲線走勢。4.2 BD-Rate 計算的常見坑與正確姿勢BD-Rate 是 Bj?ntegaard 提出的率失真曲線差異指標。大意是把兩條曲線在共同質(zhì)量區(qū)間做擬合、積分算出平均碼率節(jié)省百分比。一個直觀理解如果編碼器 A 在 PSNR 37dB 時要 2.0Mbps編碼器 B 只要 1.4Mbps那在這個點上 B 省了約 30% 碼率。BD-Rate 就是把多個質(zhì)量點上的這種節(jié)省做加權平均。但這里有幾個非?,F(xiàn)實的坑。第一曲線重疊區(qū)間必須足夠?qū)捜绻环劫|(zhì)量范圍太窄積分區(qū)間一縮再縮算出來的 BD-Rate 不穩(wěn)定。我在實踐中見過有人只給兩個碼率點就報“-40%”這基本是自欺欺人。第二失真指標要統(tǒng)一不要 A 用 PSNR、B 用 VMAF 算完再混在一起比。第三擬合方式有講究通常把碼率取 log10質(zhì)量作為自變量比較穩(wěn)定。細節(jié)做不好數(shù)字就不可信。如果條件允許直接把原始 RD 數(shù)據(jù)點也貼出來比只看 BD-Rate 一個數(shù)更有說服力。4.3 開源路線從 CompressAI 到神經(jīng)視頻壓縮如果你沒接觸過神經(jīng)編碼我很推薦先從 CompressAI 入手。這是一個基于 PyTorch 的平臺集成了大量圖像/視頻壓縮模型結(jié)構包括超先驗、自回歸上下文、端到端率失真訓練的評估腳本。先跑通圖像壓縮再切到視頻版本能很快建立起“編碼器網(wǎng)絡熵模型率失真損失”的整體感覺。真正做神經(jīng)視頻壓縮時常見路線有兩種一種保留顯式運動估計用光流網(wǎng)絡估計運動對運動向量和殘差分別編碼這種設計和傳統(tǒng)視頻編碼有對應關系好理解好調(diào)試另一種是完全隱式的幀間對齊用可變形卷積或注意力模塊做運動建模不需要顯式光流性能上限通常更高但訓練難度也更高。選哪條路取決于團隊對傳統(tǒng)編碼的依賴程度如果是從視頻編碼團隊轉(zhuǎn)過去先走顯式運動路線會更順。訓練建議三條先在 256×256 或 320×180 的小分辨率上跑通別一上來就 4Kbatch size 受限于顯存時用梯度累積每個 epoch 結(jié)束后在驗證集上算真實重建指標而不要只看訓練損失。我第一次訓練時就是忽視了驗證集結(jié)果熵模型在訓練分布上過擬合編碼真實視頻時碼率估計嚴重不準吃了大虧。5. 常見誤區(qū)與高頻問題排查實錄5.1 三個流傳最廣的理解誤區(qū)誤區(qū)一神經(jīng)編碼就是給 H.266 掛個 AI 濾鏡。這個說法把“AI 增強”和“神經(jīng)編碼”混為一談。AI 濾鏡是在傳統(tǒng)碼流上做后處理碼流本身還是 H.266 的神經(jīng)編碼的碼流從設計上就是給神經(jīng)網(wǎng)絡解碼器用的兩者根本不是一回事。誤區(qū)二神經(jīng)編碼一定全面碾壓 VVC。在標準評測集上神經(jīng)編碼論文確實頻繁報出亮眼的 BD-Rate 數(shù)字但你要看測試內(nèi)容、碼率區(qū)間、參考軟件版本。換成復雜的運動場景、極端噪聲、屏幕內(nèi)容穩(wěn)定性和成熟度還遠不如打磨多年的傳統(tǒng)編碼器。潛力大和成熟是兩回事。誤區(qū)三推理時改一下 λ 就能適配所有碼率。λ 是訓練時固定的超參推理階段去改它并不會持續(xù)生效。要覆蓋高、中、低碼率要么訓練多個模型要么用支持率失真正則項插值的結(jié)構設計這是模型能力問題不是一個“參數(shù)旋鈕”問題。5.2 訓練和部署中的高頻問題速查下面這張表是我自己踩過、以及幫別人排查過的問題匯總基本覆蓋了神經(jīng)視頻編碼落地初期最常見的崩潰現(xiàn)場現(xiàn)象可能原因處理建議熵模型預測碼率和實際碼流偏差大熵模型過擬合訓練分布增加訓練數(shù)據(jù)多樣性、降低學習率、加驗證集監(jiān)控重建畫面細節(jié)模糊損失函數(shù)只用 MSE引入感知損失或 VMAF 代理損失重訓GPU 顯存不足中間特征圖過大減小 batch、用梯度累積、降低通道數(shù)、patch 訓練編碼推理時延高模型前向超先驗分支開銷int8 量化、算子融合、小模型蒸餾碼率波動明顯缺乏碼率控制模塊使用多 λ 模型選擇或可調(diào)節(jié)隱特征縮放模塊紋理區(qū)域重建發(fā)糊訓練數(shù)據(jù)中高頻紋理不足補充高頻場景數(shù)據(jù)調(diào)整損失中高頻權重我在實際排查中吃過最大的虧是“熵模型過擬合”。模型在訓練集上碼率估得很準一到真實視頻上碼率估計和實際產(chǎn)生的碼流對不上直接導致率失真曲線變形BD-Rate 完全失真。解決方法是把驗證集和訓練集明確分開每個訓練階段都跑一次真實熵編碼流程來對比不要只看訓練損失。5.3 現(xiàn)階段哪些場景真正適合試點雖然神經(jīng)編碼還沒有到全場景替代傳統(tǒng)編碼器的階段但有些場景已經(jīng)值得試點。離線轉(zhuǎn)碼是首選短視頻、長視頻、媒體資料庫時延不敏感可以用大模型慢慢壓縮再按需分發(fā)醫(yī)學影像、工業(yè)視覺、檔案存儲這類內(nèi)容分布相對集中、對畫質(zhì)細節(jié)要求很高的場景模型可以針對性訓練數(shù)據(jù)量大時省碼率就是省存儲成本還有超低碼率下的監(jiān)控回放等場景神經(jīng)編碼在人工觀感上的優(yōu)勢有機會發(fā)揮。不適合硬上的場景也很明確實時直播的低延遲推流因為編碼端推理延遲和碼率波動都會傷體驗固定碼率嚴格約束的協(xié)議鏈路傳統(tǒng)碼率控制更穩(wěn)存量硬件異構嚴重的環(huán)境神經(jīng)網(wǎng)絡算子的平臺兼容性問題會拖后腿。我的整體判斷是未來五年更可能是混合架構階段神經(jīng)編碼做某些內(nèi)容類別的專用壓縮傳統(tǒng)編碼器繼續(xù)兜底通吃兩邊互補而不是誰直接干掉誰。最后分享一點個人體會。評估神經(jīng)編碼時我吃過“只看數(shù)字”的虧BD-Rate 漂亮了幾十個點到了真實場景卻被測試人員吐槽重建畫面發(fā)飄。后來我養(yǎng)成了一個習慣任何模型對比都要在 6 個碼率點以上、用 PSNR/VMAF/人眼三管齊下并且一定要挑出幾條不在訓練分布里的“野序列”來壓測。另一個體會是把神經(jīng)編碼和傳統(tǒng)編碼放在對立面沒有意義做工程的都知道新舊技術遷移從來不是一鍵切換。想入局的團隊我建議先用我上面說的流程做一次小規(guī)模評估把“端到端率失真訓練”親手跑通再判斷你們的內(nèi)容場景適不適合。踩過一輪坑你會發(fā)現(xiàn)“神經(jīng)編碼不是 AI 調(diào)參數(shù)”這句話不只是概念糾偏背后是實打?qū)嵉募夹g棧、思維方式和工程邏輯的重構。