偏微分方程数值解法pdf_天生一对,硬核微分方程与深度学习的联姻之路

article/2025/8/27 23:11:17

机器之心原创

作者:蒋思源

微分方程真的能结合深度神经网络?真的能用来理解深度神经网络、推导神经网络架构、构建深度生成模型?本文将从鄂维南、董彬和陈天琦等研究者的工作中,窥探微分方程与深度学习联袂前行的路径。

近日,北京智源人工智能研究院开展了第一次论坛,其以「人工智能的数理基础」这一重大研究方向为主题,从数学、统计和计算等角度讨论了智能系统应该怎样融合数学系统。

在论坛中,北京大学董彬副教授、林伟研究院和张志华教授等研究者从基础出发介绍了「数学」眼中的机器学习是什么样的。而这些数理基础,正好是构建可计算、可泛化、可解释和稳健 ML 系统所必需的。

在众多演讲中,我们发现董彬老师介绍的微分方程非常有吸引力,它对于探索新的深度学习架构、构建更高性能的深度学习模型非常有帮助。因此在这篇文章中,我们重点关注微分方程在深度学习中的应用,看起来,它们确实是天生一对的组合。

微分方程与深度学习

深度学习还能与微分方程相结合?是的,这是一个很有意思的领域,近来也有非常多的研究成果,包括 NeurIPS 2018 的最佳论文。那么什么是微分方程,它结合深度学习又有什么用呢?

按照维基百科的描述:「微分方程是一种数学方程,用来描述某一类函数与其导数之间的关系」,因此一个方程如果同时包含函数及其导数,那么就可以称为微分方程。例如,f'(x) = 2x 就是一个常微分方程,我们可以「看出来」其通解为 f(x)=x^2 +C,其中 C 表示任意常数。

不过深度学习一般也就会用到概率论、线性代数和最优化等基础数学,似乎与微分方程没什么关系?其实并不然,如果我们探索网络架构到底与数学的哪些概念是相关的,那么会发现深度神经网络可以理解为一种微分方程。即,深度神经网络架构,就是离散化的微分方程。

因此如果能找到了微分方程与深度网络之间的关系,那么两个领域之间的研究成果就能互相借鉴,也就能找到更高效的深度模型。

此外,深度学习的模型设计缺少系统指导,大多数深度学习模型都缺少可解释性,这也限制了它的应用。如果加上了微分方程,那么网络架构就是数值微分方程,网络训练就是最优控制,神经网络的设计也就能有理论指导了。

efa7e0f44142148332cb1d5aea665704.png

如上图所示,比较受关注的是神经网络架构与数值微分方程之间的关系,这个领域早期比较有影响的就是北大、普林斯顿教授鄂维南老师的研究,它首次将残差网络理解为微分方程。北大董彬等研究者在 ICML 2018 中进一步表明 ResNet、PolyNet、FractalNet 和 RevNet 等网络都可以理解为微分方程的不同数值离散方式。

此外,在 NeurIPS 2018 的最佳论文中,陈天琦等研究者提出神经常微分方程,在近似常数级的内存成本上,ODENet 能实现高效的图像分类和生成任务。在 ICLR 2019 中,陈天琦等研究者进一步将微分方程应用到流模型中,从而获得内存效率更高的生成模型。

正如董彬老师所言,通过结合微分方程,我们可以从数学角度出发设计网络架构,并分析它们的泛化性能和可解释性。在这篇文章中,我们希望从基本概念到应用,介绍该领域的一些新想法。

数学老师眼中的 ResNet

鄂维南院士是一位主要关注数学领域的研究者,也是北京大学和普林斯顿大学的教授。在 17 年的《Communications in Mathematics and Statistics》中,鄂维南发表了一篇文章,他讨论了使用连续动力学系统建模高维非线性函数的想法,即微分方程与深度学习之间的关系。

以下是该工作的地址:

  • 论文:A Proposal on Machine Learning via Dynamical Systems

  • 论文地址:https://link.springer.com/article/10.1007/s40304-017-0103-z

在这篇「Proposal」中,鄂老师表示深度神经网络可以理解为离散的动力学系统。离散的动力学系统很难分析,但连续的动力学系统在数学上更易于分析,因此它可作为深度神经网络的数学基础。此外,因为有很多种方式离散化动力学系统,所以我们也许能构建更多有意思的模型。例如,动力学系统可以选择自适应的时间步大小,这对应于选择自适应的神经网络层级。

这一篇文章提出了非常多的新洞见,尤其是结合常微分方程与深度残差网络的新视角。下面让我们看看在数学家的眼中,残差网络到底该怎样推导。

离散动态系统:ResNet

因为 DNN 可以视为离散的动力学系统,那么每一步最基础的动力学过程即线性变换加上非线性激活函数,这是最简单的非线性离散动力学系统之一。具体而言对于深度残差网络,我们可以用离散动态系统描述为:

b7a88f4919038cbf3b29754f53f39b22.png

其中 Z_l 和 Z_l+1 为第 l 层的输入与输出,y_l 为第 l 层的辅助变量,h 和 g 为一些映射,它们可以是线性的,也可以是非线性的。对于深度神经网络,如果 g 和 h 是恒等映射,训练会非常顺畅,那么为什么会这样呢?为什么 g 和 h 是恒等映射就能减轻梯度爆炸或消失问题?

实际上,如果令 G 为 g 的逆向映射(inverse map),我们可以将上述动力学系统写为:

ece205bd71238f8ee7f73736dbeb23dc.png

为了有一个稳定的训练过程,即梯度不爆炸、不消失,上述方程右边的梯度需要接近于恒等映射。也就是说,梯度由后向前传时,它在量上需要保持稳定。鄂老师表示若令 h 和 g 都为恒等映射,∇G∇h 就逼近恒等映射(F 为较小随机扰动),梯度的传递就非常平稳。

其实若 h 和 g 为恒等映射,那么方程 2.3 就可以写为:

0695c46e62991e559f2b5b24e750f13f.png

这难道不就是标准的残差连接吗?它不就是如下动态系统的离散化吗?

8ddd1fdfbe4d5a3ea6cca35e0cee313e.png

这里 t 相当于层级 l 的连续化,如果 l 趋向于无穷小,那么按照导数的定义,z_l+1 与 z_l 两层之间的差就趋向于 z 对 t 的导数。所以,可以说残差网络其实就是连续变换的欧拉离散化,它是一个特例。

如果从导数定义的角度来看方程 2.7,当 t 的变化趋向于无穷小时,隐藏状态的变化 dz 可以通过神经网络建模。当 t 从初始一点点变化到终止,那么 z(t) 的改变最终就代表着前向传播结果。

从节选的几步推导,我们可以看到,ResNet 能天然理解为动力学系统,能用微分方程天然表示。但是所有的,或大多数深度神经网络都能这样理解吗?董彬老师做了进一步的研究,他们将这一观点推广到了更多的深度神经网络。

其它深度卷积网络又怎样?

北京大学董彬副教授等研究者做了进一步探讨,即 ResNet 与微分方程的这种关系是特例还是一般化的联系。如果数值 ODE 和网络构架的联系建立起来了,董彬老师表示我们就可以从数值 ODE 反推出一些有用的神经网络构架。因为 ODE 已经发展了几十年,有丰富的研究成果可以参考,反推的新架构可能取得更好的效果。

在 ICML 2018 的一项研究中,董彬等研究者表示很多高效的卷积神经网络都能解释为微分方程,并基于微分方程的线性多步解法提出新的线性多步架构,这种结构能提升 ImageNet 等的图像分类任务的性能。

  • 论文:Beyond Finite Layer Neural Networks: Bridging Deep Architectures and Numerical Differential Equations

  • 论文地址:https://arxiv.org/abs/1710.10121

微分方程的解法即网络架构

这里展示了其它卷积网络与微分方程之间的关系,它们在图像识别等任务上都非常有效。如下所示为 ResNet 及其它三种卷积网络架构。

32f4d6b94866222db3f0dd222ab9153c.png

图源:arXiv: 1710.10121

其中 PolyNet 为每个残差模块引入了 PolyInception 模块,从而加强模块的表达能力。PolyInception 模块是 Inception 单元的「多项式」组合,它会以并行或串行的方式集成多条计算路径。FractalNet 以自相似性为基准设计架构,它会重复引用简单的扩展规则,从而生成结构为截断分形(fractal)的深度网络。最后的 RevNet 是一种可逆网络,它不需要在前馈传播中储存中间激活值。

在下表中,董彬老师总结了不同卷积网络对应的微分方程数值解法。其中 ResNet 和 ResNeXt 可视为步长为 1 的前向欧拉离散化,其它卷积网络也对应着不同的离散化方式。

a2982aac44aa38fe6f7c4783c65e89bc.png

图源:arXiv: 1710.10121

PolyNet

这里我们先看看 PolyNet 怎样搭上微分方程这班车。PolyNet 主要希望提供多样性的架构,因此 PolyInception 除了常规残差模块的一阶路径,还添加了另一条二阶路径。具体而言,PolyInception 模块可以表示为:

2db252d59420e2af1499a015214f6a7c.png

其中 I 表示恒等映射,「·」表示作用于,即 F·x 表示非线性变换 F 作用于 x。我们可以看到,PolyInception 多了一个二阶的复合函数,也就是说,如果 F 表示某种 Inception 模块,那么二阶的路径会穿过串联的两个 Inception 模块。在 PolyNet 原论文中,作者展示了可能的 PolyInception 结构:

6faac5014fa4cec5e2a8c19cf088a32a.png

图源:arXiv: 1611.05725

如上所示,a 和 b 是等价的,F 和 G 表示是否共享参数。董彬老师表示,PolyNet 可以解释为时间步为 1 的反向欧拉方法,实际上前向传播就是在解一个反向欧拉。

94eeaecccbee2c82d527cc6273e9b8cc.png

不过本身反向欧拉要求解一个非常巨大的非线性方程组的逆,这样无法求解就只能用多项式去逼近解。也就是说,上式的求逆又可以写为:

f15d5b1acdb77338432f4df966c41a6c.png

因此,PolyNet 可以视为采用反向欧拉策略解常微分方程 u_t = f(u) 的逼近方法。如果这样理解,那么它暗示着允许更大的时间步大小,因此这表示我们可以采用更少的残差模块就能构建更好的效果。这正好解释了,为什么 PolyNet 能增加残差模块宽度而降低层级深度,从而实现更好的分类准确度。

此外,从微分方程的角度来说,反向欧拉法要比正向欧拉法有更好的稳定性。这也能从侧面说明为什么在相近参数和计算量下,PolyNet 能实现更好的效果。

FractalNet 与 RevNet

FractalNet 与 RevNet 也都有对应的微分方程「解法」,研究者发现 FractalNet 的宏观架构能解释为数值分析中著名的 Runge-Kutta 方法。例如对于复合次数小于等于 2 的 FractalNet,每一个模块都可以表示为:

979391b3cd31bf10aea0ab965edcd774.png

其中 f_1 和 f_2 分别表示不同的 Fractal,如果我们看看二阶的 Runge-Kutta 方法,我们就会发现他们的表达式非常相似:

45445881e3bac86cb8440fff53238bff.png

另外的 RevNet 也是一样,因为它是一种可逆的深度网络,所以它有从 X 到 Y 和 Y 到 X 的过程。如果它们分别对应着前向欧拉方法,那么就表示两条简单的动态系统就能描述整个神经网络。此外值得注意的是,虽然深度学习中很少有可逆的双向网络,但是在微分方程中,动态系统的正反向都是可行的。

最后,董彬老师还根据数值微分方程提出了一种新的结构:Linear Multi-step Architecture。他表明加上这种结构,残差网络只需要一半的参数量就能达到相同的训练效果,这表示新结构使卷积网络的训练更高效与稳定,希望了解的读者可查阅董老师的原论文。

神经化的微分方程

微分方程除了为深度网络提供理论解释,并启发架构创新,它还能做一些更炫酷的工作吗?多伦多大学陈天琦等研究者表示,既然残差连接就是常微分方程(ODE)的离散化,那么常规神经网络的前向传播过程岂不就是微分方程给定初值解末值的过程?如果我们用业界成熟的微分方程求解器(ODESolve)解某个 ODE,这不就能代替前传和反传么?

在他们的研究 ODENet 中,研究者使用神经网络参数化隐藏状态的导数,而不是如往常那样直接参数化隐藏状态。这里参数化隐藏状态的导数就类似构建了连续性的层级与参数,而不再是离散的层级。因此参数也是一个连续的空间,我们不需要再分层传播梯度与更新参数。

简而言之,ODENet 中的神经网络建模可以表示为下式:

65b85a569274a42d7afeb42090b093cd.png

其中 f 表示的是神经网络,h 表示的是隐藏状态。相比而言,常规卷积网络可表示为 h(t+1) = f(h(t), θ)。

如果参数化的是隐藏状态的变化,神经微分方程在前向传播过程中不储存任何中间结果,因此它只需要近似常数级的内存成本。

  • 论文:Neural Ordinary Differential Equations

  • 论文地址:https://arxiv.org/abs/1806.07366

  • 实现地址:https://github.com/rtqichen/torchdiffeq

新颖的前传与反传

其实 ResNet 只不过是简单的欧拉离散化,而近百年来,数学家构建了很多现代 ODE 求解方法。这些新方法不仅能保证收敛到真实解,同时还能控制误差水平。

ODENet 就采用了一种适应性 ODESolver 代替前向传播过程,它不像欧拉法移动固定的步长,相反它会根据给定的误差容忍度选择适当的步长逼近真实解。

如下图所示,左边的残差网络定义有限转换的离散序列,它从 0 到 1 再到 5 是离散的层级数,且在每一层通过激活函数做一次非线性转换。此外,黑色的评估位置可以视为神经元,它会对输入做一次转换以修正传递的值。而右侧的 ODE 网络定义了一个向量场,隐藏状态会有一个连续的转换,黑色的评估点也会根据误差容忍度自动调整。

2fe5121bb9bf9f8c0c7899018ed4213b.png

图源:arXiv: 1806.07366

所以 ResNet 采用的是固定的步长 1,适应性 ODESolver 可以自动估计不同的步长,它的自由度和误差控制都更强一些。

对于新颖的前向传播,我们可以通过两段伪代码了解它与常规方法的不同之处。如下是 ResNet 的简要伪代码,定义 f 为卷积层、T 为残差块的数量:

def f(h, t, θ): return nnet(h, θ_t) def resnet(h): for t in [1:T]: h = h + f(h, t, θ) return h

如下展示的是整个 ODEnet 的伪代码,f 表示的也是神经网络层级。不过它不需要层层堆叠离散的层级,只要通过 ODESolver 求出终止时刻 t_1 的 h 就行了,整个 ODESolver 就是一个黑箱过程。

def f(h, t, θ): return nnet([h, t], θ)def ODEnet(h, θ): return ODESolver(f, h, t_0, t_1, θ)

所以不同之处在于 ODESlover 代替了整个前传过程,这样岂不是无法进行反向传播了?为了「绕过」前向传播中的 ODESolver,陈天琦等研究者采用了一种名为 adjoint method 的梯度计算方法。也就是说,模型在反传中通过第二个增广 ODESolver 算出梯度,其可以逼近按计算路径从前向 ODESolver 传递回的梯度,因此可用于进一步的参数更新。

总之,通过一系列推导,反向传播在不知道中间激活值的情况下,直接求一个微分方程就行了。我们并不需要一层层反向传递梯度,就能直接获得更新参数的梯度。ODENet 的反向传播过程如下伪代码所示:

def f_and_a([z, a], t): return[f, -a*df/da, -a*df/dθ][z0, dL/dx, dL/dθ] =  ODESolver([z(t1), dL/dz(t), 0], f_and_a, t1, t0)

其中 f_and_a 为增广状态的动力学过程,用于求解微分方程。ODESlover 求出来的 dL/dθ 就可以直接用来更新神经网络的权重。

ODENet 采用了一种非常新颖的前向与反向传播过程,它和常规的神经网络训练完全不一样。它的优势也体现在这种差异上,因为反向传播不需要保留前传的中间计算结果,所以只需要常数级的内存要求。

微分方程也能搭生成模型

在 ODENet 中,研究者也展示了将微分方程应用到生成模型的前景。因此在 ICLR 2019 中,陈天琦等研究者进一步研究了微分方程如何用于流模型。

  • 论文:FFJORD: Free-form Continuous Dynamics for Scalable Reversible Generative Models

  • 论文地址:https://arxiv.org/abs/1810.01367

目前,最流行的生成模型 GAN 通过生成器与判别器的博弈,从而逼近真实数据的概率密度函数 p(x)。但流模型希望通过一系列可逆转换,明确地学习到数据分布 p(x)。因此,流模型会通过可逆神经网络将数据点从一个简单分布映射到复杂分布。

但基于似然度训练常规流模型需要限制它们的架构,从而使雅可比行列式的计算成本足够小。例如流模型 Real NVP 或 Glow 等,它们对矩阵维度进行分割或使用秩为 1 的权重矩阵进行限制。

ODENet 使用常微分方程定义了一种从隐变量到数据的映射,它可以使用相对低成本的迹运算计算雅可比行列式。后面提出的 FFJORD 进一步发扬了这种观点,它将迹估计和前向传播都定义为了常微分方程,并使用 ODESolver 直接求解。直观而言,FFJORD 的抽象过程可如下图所示:

e8052daf72adf375862c97f26a1f3329.png

图源:arXiv: 1810.01367

如上图所示,对于微分方程而言,我们知道初始的随机分布 z(t_0),并系统通过 ODESolver 解出真实图像分布 z(t_1)。如果知道了 z(t_1),那么从中采样就能生成真实图像。

最后,这些方向与成果都表明,微分方程真的可以和深度神经网络相结合。也许以后,微分方程乃至其它数理基础,都能帮助我们构建更鲁棒和可解释性的机器学习系统。b28ef473498f38bbc2292389c9b0886f.png

本文为机器之心原创,转载请联系本公众号获得授权

✄------------------------------------------------

加入机器之心(全职记者 / 实习生):hr@jiqizhixin.com

投稿或寻求报道:content@jiqizhixin.com

广告 & 商务合作:bd@jiqizhixin.com


http://chatgpt.dhexx.cn/article/m3uK20PB.shtml

相关文章

椭圆型偏微分方程数值解法

一、 一维椭圆方程数值解 matlab代码&#xff1a; function chap2_fdm_elliptic_1D % 一维椭圆方程求解(常微分方程边值问题) % -u q(x)u f(x), 0<x<1, 取q(x) x, f(x) (x-1)exp(x) % u(0) 1, u(1) e; 边界条件 % 真解为 u exp(x)N 20; h 1/N; x_al…

Python小白的数学建模课-11.偏微分方程数值解法

偏微分方程可以描述各种自然和工程现象&#xff0c; 是构建科学、工程学和其他领域的数学模型主要手段。 偏微分方程主要有三类&#xff1a;椭圆方程&#xff0c;抛物方程和双曲方程。 本文采用有限差分法求解偏微分方程&#xff0c;通过案例讲解一维平流方程、一维热传导方程…

偏微分方程数值解法pdf_单摆-微分方程浅谈

引子[1] 单摆&#xff0c;这个在中学物理都学过的东西&#xff0c;应该是非常熟悉了。 图片来源-维基百科 小角度简单摆 若最高处( )的绳子和最低处(速度最大值)的绳子的角度为 &#xff0c;则可使用下列公式算出它的振动周期。 公式证明 摆球受力分析 绳与对称线夹角为 &…

偏微分方程数值解法pdf_数值模拟偏微分方程的三种方法:FDM、FEM及FVM

偏微分方程数值模拟常用的方法主要有三种:有限差分方法(FDM)、有限元方法(FEM)、有限体积方法(FVM),本文将对这三种方法进行简单的介绍和比较。 一.有限差分方法 有限差分方法(Finite Difference Methods)是数值模拟偏微分方程最早采用的方法,至今仍被广泛运用。该方法包括区…

正圆锥体空间方程_数值模拟偏微分方程的三种方法:FDM、FEM及FVM

偏微分方程数值模拟常用的方法主要有三种:有限差分方法(FDM)、有限元方法(FEM)、有限体积方法(FVM),本文将对这三种方法进行简单的介绍和比较。 一.有限差分方法 有限差分方法(Finite Difference Methods)是数值模拟偏微分方程最早采用的方法,至今仍被广泛运用。该方法包括区…

抖音图标

抖音图标&#xff1a; 1.创建一张画布&#xff0c;再用圆角矩形工具创建一个圆角矩形 2.新建一个图层&#xff0c;用椭圆选框工具创建一个圆&#xff0c;再alt键从选区减去一个圆 3.再填充一个颜色&#xff0c;再剪切1/4圆接着粘贴拖拽至右上方 4.新建一个图层&#xff0c;用…

抖音图标——ps

抖音图标 1.用圆角矩形工具画个圆角&#xff08;空格键可以移动&#xff09;&#xff0c;填充为黑色&#xff0c;把此图层转换为珊格式化 2.再新建一个图层&#xff0c;用椭圆选框工具画个换个环&#xff08;用alt会出现&#xff0c;shift会出现加号&#xff09; 3.Ctrlx剪…

抖音软件分析

前几天看了看关于短视频软件的火的一些话题&#xff0c;就去看了看关于抖音的&#xff0c;对于抖音是那几个方面&#xff0c;自己也去做了一些分析&#xff0c;首先是在两个方面去做的一个理解&#xff0c;一个是软件制作&#xff0c;一个是商业运营。 软件制作 在抖音的软件…

仿抖音视频自动播放html,vue 仿抖音视频播放切换

一、第一部分html页面的准备 {{item.title}} {{item.introduction}} 二、数据说明部分 data() {let u = navigator.userAgent; return {showSlide: 0, allLoaded: false, //数据是否全部加载完 page: 1, isLoading: true, option: {}, current: 0, videoList: [], isVideoShow:…

抖音账号官方认证

介绍 认证功能入口 【我】—【创作者服务中心】— 【官方认证】 抖音黄V是什么&#xff1f; 抖音黄V是抖音平台对个人能力与专业性的认可。换句话讲&#xff0c;黄V即能体现个人身份标签又可以获得官方在内容发布的“豁免权”。如未认证的用户去进行科普&#xff0c;轻则警…

仿抖音首页界面

目录 效果图 顶部相关代码 顶部效果图 内容相关代码 内容效果图 底部导航栏相关代码 底部导航栏效果图 完整代码 html css js ​flexible.js 要想做出抖音短视频的首页界面&#xff0c;我们要引用swiper插件、还需要用到iconfont图标&#xff08;可自行到官网上下载…

抖音小程序Tiktok开发教程之 基础组件 04 icon 图标组件

什么是icon组件? icon是图标组件 icon组件运行效果 icon组件如何使用呢? 首先,在ttml界面中添加下面代码 <view class="container"><view class="body"><view class="page-section page-default"><view class="…

分享图片或链接到抖音

目录 前言 一、官方文档 二、开始配置 第一步&#xff1a;向抖音短视频申请你的 clientkey 及相关权限 第二步&#xff1a;集成到开发环境 1.根目录下build.gradle引入库 2.app moudel目录下build.gradle引入库 3.配置抖音的软件包可见性 使用一&#xff1a;Android-分…

仅用一个 HTML 标签,实现带动画的抖音 Logo

作者 | 零一 来源 | 前端印象 今天给大家表演 仅用一个HTML标签实现带动画的抖音LOGO&#xff0c;涉及了很多知识点&#xff0c;欢迎交流讨论 先上结果&#xff0c;最终实现效果如下&#xff1a; 成品图 还原度应该还可以吧&#xff1f; 抖音Logo结构 想要用CSS来画抖音的Logo&…

用python+pillow模块实现抖音晃眼睛的特效,图像处理之路(附源码)

前言 利用Python实现抖音晃眼睛的特效&#xff0c;让我们愉快地开始吧~ 开发工具 Python版本&#xff1a; 3.6.4 相关模块&#xff1a; pillow模块&#xff1b; numpy模块&#xff1b; argparse模块&#xff1b; 以及一些Python自带的模块。 环境搭建 安装Python并添加到…

仅用一个HTML标签,实现带动画的抖音LOGO

大家好&#xff0c;我是零一&#xff0c;今天给大家表演 仅用一个HTML标签实现带动画的抖音LOGO&#xff0c;涉及了很多知识点&#xff0c;欢迎交流讨论 先上结果&#xff0c;最终实现效果如下&#xff1a; 还原度应该还可以吧&#xff1f; 抖音Logo结构 想要用CSS来画抖音的…

uni-app项目引入图标

uni-app项目引入图标 普通图标引入 1、阿里巴巴矢量图官网创建图标项目 2、将搜索的图标添加进购物车&#xff0c;在购物车里面将图标添加进项目里面 3、下载该文件到本地&#xff0c;将该文件的css文件复制到项目里面 &#xff08;并设置大小&#xff09; 4、修改icon…

免费下载无水印抖音视频

今天&#xff0c;跟大家分享一个免费下载抖音视频的方法&#xff0c;可以去除抖音上的id水印。话不多说&#xff0c;直接上图。 1.复制手机端抖音链接。 点击这个分享图标 复制链接 发送到电脑&#xff0c;打开网页http://douyin.adsond.com/&#xff08;点此直接进入&…

抖音下载android,抖音完整版

《抖音完整版》这是一款可以发布完整版视频资源的软件&#xff0c;在软件中多种精彩丰富的视频内容&#xff0c;拥有各种最新的潮流以及特色的丰富内容&#xff0c;等你来看&#xff01;这里超多种丰富好玩的视频资源&#xff0c;特色的观看体验&#xff01;(以下来为大家介绍详…

CSS3解析抖音 LOGO制作

“抖音”,人气也是非常高,据说拥有7亿用户。 今天我们就来研究研究抖音的logo,蹭蹭热度。 效果预览: 主要用css3新增属性mix-blend-mode,”组成,然后有3种颜色,白色、红色、和天蓝色。 ok,我们先来完成一个“J”。根据以往的经验,我们把它拆分成3部分。 下面我们来…