ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

神经编码不是调参:从自编码器到熵模型,拆解下一代视频编码的本质差异

神经编码不是调参:从自编码器到熵模型,拆解下一代视频编码的本质差异 视频编码这个圈子最近两年有个词被反复提起——神经编码也就是 Neural Codec。很多做音视频开发的朋友第一次听到这个概念第一反应是哦又是拿深度学习那套来调参呗然后下意识地把它和传统编码器里那些需要手工调的 QP、GOP、码率控制参数划上等号。这个理解偏差其实挺致命的因为它会让你完全抓不住神经编码真正在改变什么。我自己从 H.264 时代一路跟到 H.265再到这两年动手跑过几个神经编码的开源实现踩过的坑和推翻过的认知都不少。这篇就把我理解的神经编码到底新在哪里、它和传统编码的本质差异、以及一个普通开发者该怎么上手掰开揉碎讲清楚。不管你是刚接触视频编码的新人还是已经调了几年 x265 参数的老手看完应该都能对下一代编码的走向有个更实在的判断。1. 先把调参数这个误解拆开看1.1 传统编码器里参数到底在调什么要理解神经编码为什么不是调参数得先搞清楚传统编码器里那些参数究竟在干什么。以 H.265/HEVC 为例一个编码过程大致分成预测、变换、量化、熵编码这几步。预测分帧内和帧间帧间预测会去参考帧里找最匹配的块算出运动矢量变换把残差从空域转到频域通常是 DCT 类的变换量化这一步是真正丢信息的地方QP 值越大丢得越狠、码率越低最后熵编码把系数和语法元素压成比特流。你调的那些参数本质上是在给这套固定的数学流程选一组配置。比如--crf控制的是量化强度--preset控制的是搜索运动矢量的努力程度越快越省时间但压缩效率越低--bframes决定能连续用多少个 B 帧。这些参数不会改变编码器的骨架只是在这套骨架里找一个你满意的码率和画质的平衡点。换句话说传统编码器是一台结构固定的机器参数是旋钮你拧旋钮改变的是工作点不是机器本身。1.2 神经编码动的是骨架而不是旋钮神经编码最根本的不同在于它把上面那套预测-变换-量化-熵编码的固定流水线整体替换成了可学习的神经网络。编码端和解码端各是一个网络中间传递的不再是运动矢量、DCT 系数这些人类设计出来的语法元素而是一组网络自己学出来的隐特征latent representation。这就意味着你没法再用调 QP的思路去理解它。因为量化发生在隐特征上而隐特征长什么样、每个维度代表什么是训练出来的不是设计出来的。你改一个超参数比如隐特征的通道数或者量化步长改变的是整个表示空间的结构而不是在一个固定空间里挪位置。打个比方传统编码像是一台手动挡汽车参数是油门离合的配合神经编码更像是换了一台完全不同动力总成的车你踩的不再是离合而是另一套控制逻辑。1.3 为什么这个误解会普遍存在这个误解普遍我觉得有两个原因。一是早期确实有不少工作只是拿神经网络去替换编码器里的某一个模块比如用 CNN 做帧内预测、用网络做环路滤波这种AI 增强传统编码的路子本质上还是在调那台机器的某个零件所以大家自然觉得不就是调参嘛。二是神经编码的论文里也有一堆超参数码率控制里也有类似 λ 的拉格朗日乘子表面上看和传统码率控制长得像容易让人误以为是一回事。但真正的端到端神经编码是把整个编解码链路都交给网络去学这跟给传统编码器加个 AI 模块是两码事。分清楚这一点后面所有的讨论才有意义。2. 神经编码的底层机制到底长什么样2.1 从自编码器说起压缩的本质是找低维表示神经编码的理论根基其实是自编码器Autoencoder。自编码器的思路很朴素让网络把输入 x 压成一个低维的 z再让另一个网络从 z 还原出 x训练目标就是让 x 尽量接近 x。中间那个 z 就是压缩后的表示。视频编码无非是把这个思路用到了视频帧序列上。编码网络分析变换把当前帧或者帧组压成隐特征解码网络合成变换把它还原。为了让压缩真正省比特还要在隐特征上加一个量化操作把连续的浮点值变成离散值这样才能用熵编码去压。量化必然带来失真所以整个系统的训练目标通常是码率 失真的加权和失真用 MSE 或者更贴近人眼感知的指标码率用隐特征的熵来估计。这里有个关键点传统编码里变换DCT和量化是分开设计的变换追求能量集中量化追求率失真最优。而在神经编码里这两件事是联合优化的网络自己会学出一个既好量化、又对重建友好的表示。这就是它理论上能超过传统编码的原因之一。2.2 量化为什么是绕不过去的坎量化是神经编码里最麻烦的一环因为它不可导。训练神经网络靠反向传播而量化是个阶跃函数导数几乎处处为零梯度传不回去。这个问题不解决整个端到端训练就断了。业界常见的处理办法有几种。一种是在训练时用加性均匀噪声近似量化前向用真正的取整反向用噪声的梯度这样梯度能传过去训练完再换成真量化。另一种是用软量化比如用一系列可学习的软阶梯函数逐步逼近硬量化。还有的直接用直通估计器STE前向取整、反向把梯度原样传过去。我实测下来的感受是加性噪声那套在低码率下更稳因为噪声的方差可以跟量化步长挂钩训练和推理的失配小一些。STE 简单粗暴但在码率很低、量化很粗的时候容易训崩。这块没有银弹选哪种得看你的码率范围和目标画质。2.3 熵模型神经编码真正拉开差距的地方如果说量化是难点那熵模型就是神经编码真正甩开传统编码的地方。传统编码的熵编码比如 CABAC用的是固定的上下文模型虽然也有自适应但模型结构是人设计的容量有限。神经编码里的熵模型通常是一个条件概率网络它根据已经编码的隐特征去预测当前隐特征的概率分布然后用这个分布做算术编码。因为是学出来的它能捕捉到人设计不出来的统计规律。更狠的是这个熵模型可以以超先验hyperprior为条件——简单说就是再拿一个小网络去提取隐特征的全局统计信息作为熵模型的额外输入让概率预测更准。我跑过的一个实现里加上超先验之后同样画质下码率能降百分之十几这个收益在传统编码里得靠好几代标准迭代才能拿到。所以你看神经编码的竞争力不在调参调得好而在于它把熵模型这个环节从人设计变成了机器学。3. 和 H.265 这类传统编码的正面比较3.1 压缩效率纸面和实测的差距论文里神经编码对比 H.265 经常能看到 BD-Rate 省 20% 到 30% 的结论对比 H.266 也能省 10% 上下。但这里要泼盆冷水这些数字大多是在特定数据集、特定码率点上测出来的而且很多是 PSNR 或者 MS-SSIM 这类指标跟你实际业务里关心的主观画质不完全是一回事。我自己在几个公开测试序列上复现过低码率段比如 0.1 bpp 以下神经编码的优势确实明显因为它的熵模型能更好地利用帧间冗余但在高码率段优势会缩小有时候甚至打平因为这时候传统编码的变换和量化已经足够精细神经网络的表示能力反而没那么突出。所以别看到省 30%就无脑上得看你的业务落在哪个码率区间。3.2 计算复杂度解码端的现实压力传统编码有个巨大的优势是解码极快H.265 的硬件解码器已经烂大街手机、电视、机顶盒里全是专用芯片解码功耗低到可以忽略。神经编码目前基本靠 GPU 或者专用 NPU 跑解码一个 1080p 视频的算力开销比硬件解码器高好几个数量级。这意味着什么意味着神经编码短期内很难进到端侧播放的场景。你想想一个用户拿手机看视频总不能让他为了解码专门开个 GPU 满载跑吧发热和耗电都受不了。所以现在神经编码落地更多是在云端转码、点播存储、专业制作这些算力不缺、又对压缩率敏感的场景。端侧要等专用解码芯片成熟那是另一个时间尺度的事。3.3 标准化与生态为什么 H.266 还在推进有人会问既然神经编码这么强为什么还要搞 H.266答案是生态。一个编码标准背后是芯片厂商、内容方、设备方、专利池的整套利益链条H.266 能复用 H.265 的很多基础设施落地路径清晰。而神经编码目前没有统一标准各家实现互不兼容你用一个模型编的码流换个模型就解不出来这在工程上是致命的。不过趋势也在变MPEG 已经在推进神经编码的标准化工作一些基于神经网络的编码工具也开始被考虑进下一代标准里。我的判断是未来几年会是传统编码 神经工具混合的过渡期纯神经编码全面取代传统编码还需要时间。对比维度H.265/HEVC端到端神经编码压缩效率低码率基准通常优 20% 以上压缩效率高码率基准优势缩小甚至持平解码算力专用硬件极低GPU/NPU较高标准化程度成熟推进中未统一生态兼容性极好差模型不通用适合场景端侧播放、直播云端转码、专业制作4. 想上手神经编码从哪几个点切入4.1 先跑通一个开源实现别急着改如果你之前只碰过 FFmpeg 和 x265想入门神经编码我的建议是先找一个成熟的开源实现跑通端到端流程别一上来就想着改网络结构。比较有代表性的有基于 PyTorch 的几个端到端视频编码项目它们通常提供了训练脚本、测试脚本和预训练模型。跑通的目标是让你亲眼看到输入一段 YUV编码网络输出隐特征量化后熵编码成比特流再解码还原成视频。这个过程走一遍你对隐特征超先验率失真损失这些概念的理解会比看十篇论文都实在。我第一次跑通的时候盯着那个隐特征的可视化看了半天才真正明白机器学出来的表示和 DCT 系数长得有多不一样。4.2 环境准备里最容易翻车的几个点神经编码的代码对环境挺挑的我踩过的坑列一下。第一是CUDA 和 PyTorch 版本匹配很多项目锁死了特定版本你装个最新的反而跑不起来建议严格按 requirements 来。第二是熵编码库不少实现依赖专门的算术编码扩展编译不过的话整个流程就断了得先把这块搞定。第三是显存视频编码的隐特征张量维度不小训练时 batch size 稍微大一点就 OOM建议先用小分辨率、短序列把流程跑通再放大。还有个容易被忽略的点是数据格式。传统编码吃 YUV420神经编码很多实现吃 RGB 或者 YUV444你得先做色彩空间转换转换的精度和范围full range 还是 limited range搞错了画质对不上你会以为是模型的问题其实是数据预处理错了。4.3 训练自己的模型时损失函数怎么配如果你想在公开数据上自己训一个损失函数的配置是核心。基本形式是L R λ * DR 是码率估计D 是失真。λ 控制码率和失真的权衡λ 大偏画质λ 小偏码率。这里有个经验失真项别只用 MSE。MSE 优化出来的是 PSNR 好看但人眼看着可能发糊。可以混入 MS-SSIM 或者 LPIPS 这类感知指标画质主观感受会好很多。但要注意感知指标和码率的权衡更复杂λ 的调法跟纯 MSE 不一样得重新扫一遍。我一般会先固定一个 λ 扫出率失真曲线再根据业务目标选工作点而不是拍脑袋定一个 λ。另外训练时的码率估计和推理时的实际码率会有偏差因为训练用的是熵模型的估计值推理用的是真算术编码。这个偏差在低码率下更明显建议训练完一定要用真实熵编码测一遍实际码率别只看训练日志里的估计值。5. 实际落地时会撞上的几堵墙5.1 模型不通用换个内容就得重训这是神经编码最现实的痛点。传统编码器是通用的不管什么内容同一套参数都能编。神经编码的模型是在特定数据分布上训出来的遇到训练集里没见过的内容类型性能可能掉得厉害。比如你用自然风景训的模型去编屏幕内容或者动画效果可能还不如 H.265。业界的应对思路有几种一是扩大训练数据多样性把各种内容类型都塞进去二是做条件编码让模型根据内容类型切换模式三是在线微调针对特定内容快速调一下模型。但这几种都有代价要么模型变大要么增加编码端算力。所以现阶段神经编码更适合内容类型相对固定的场景比如影视剧点播库而不是什么内容都有的通用平台。5.2 码率控制的精度问题传统编码的码率控制虽然也不完美但经过这么多年打磨已经能做到比较准。神经编码的码率控制还在早期因为码率跟隐特征的熵直接挂钩而熵又依赖内容预测起来更难。实际做的时候常见做法是多轮编码逼近先用一个 λ 编一遍看实际码率偏离目标就调整 λ 再编迭代几次。但这在实时场景里不可行因为编码一次就很慢。所以现在神经编码的码率控制更多用在离线转码实时场景还得靠传统编码顶着。5.3 专利和合规的隐忧传统编码有明确的专利池虽然要交费但规则清楚。神经编码的专利格局目前很模糊训练用的数据、网络结构、熵模型都可能涉及知识产权而且各家实现不一样未来怎么收费、怎么合规现在谁也说不准。企业要大规模用这块得提前评估别到时候踩雷。6. 我对神经编码走向的几个判断6.1 短期是混合不是替代我个人的判断是未来三到五年主流会是传统编码框架里嵌入神经工具。比如用神经网络做更好的环路滤波、更聪明的帧内预测、更强的熵模型但整体码流结构还是兼容传统标准的。这样既能吃到神经网络的收益又不破坏现有生态。纯端到端神经编码会在特定垂直场景先落地比如云游戏、专业影视存档这些对压缩率极度敏感、又不在乎解码算力的地方。6.2 硬件是决定性的变量神经编码能不能普及很大程度上取决于专用解码硬件什么时候成熟。一旦有芯片能把神经解码的功耗和成本压到接近传统硬件解码器端侧落地的门就开了。现在一些厂商已经在做这方面的探索但离大规模商用还有距离。作为开发者盯着这个信号比盯着论文里的 BD-Rate 数字更有意义。6.3 对普通开发者的意义最后说点实在的。如果你现在的工作是调 x265 参数、搭转码流水线神经编码短期内不会让你的技能过时传统编码还得用很多年。但如果你能提前理解神经编码的原理、跑通一两个实现、知道它的边界在哪等它真正落地的时候你就是那个能接住的人。我见过太多人等到技术铺开了才去学那时候红利早没了。现在花点时间把自编码器、量化、熵模型这几个基础打牢比追着热点跑有用得多。我在实际折腾这些实现的过程中最大的体会是神经编码的难点从来不在调参而在于你得重新建立一套对表示学习的直觉。传统编码你是在一个人设计的空间里找最优点神经编码你是让机器自己去造那个空间。这个思维转换比记住任何一组参数都重要。
返回列表