如何避免在算法踩坑小记中重复犯错?

摘要:经过前面研究图像算法和近阶段研究视频和音频算法的经历经验. 在2019年快要来临的时候,写下这篇小记. 目的很简单,总结过往,展望未来. 这里列举一些本人在算法上踩过的坑和出坑思路. 主要是数据标准化问题. 1.临界值问题 (最大值,最小值
经过前面研究图像算法和近阶段研究视频和音频算法的经历经验. 在2019年快要来临的时候,写下这篇小记. 目的很简单,总结过往,展望未来. 这里列举一些本人在算法上踩过的坑和出坑思路. 主要是数据标准化问题. 1.临界值问题 (最大值,最小值,阈值,无穷小,无穷大) 最早做一键修图的时候,在这个坑上踩了太多次. 简单描述就是, (示例伪代码例子仅供理解思考参考,不具有实际意义) 1.1 梯度消失 如果一个算法在计算过程中,存在最小值(无穷小,一般为0或接近0的数), 那就很可能出现"梯度消失"的问题. 例如: floatweight = 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年预计会陆续将以前做的一些图像算法逐步梳理开源. 最后,祝大家新的一年,心想事成,美梦成真,好事成双. 本人主要专注 音频,图像,视频算法方向. 若有其他相关问题或者需求也可以邮件联系俺探讨。 邮箱地址是: gaozhihan@vip.qq.com