【人工智能概论】 Python标准库——dalib(领域自适应)
文章目录
- 【人工智能概论】 Python标准库——dalib(领域自适应)
- 一. 领域鉴别器(DomainDiscriminator)
- 二. 领域对抗损失(DomainAdversarialLoss)
- 三. 高斯核(GaussianKernel)
- 四. 多核最大均值差异(MK-MMD)
一. 领域鉴别器(DomainDiscriminator)
dalib.modules.domain_discriminator.DomainDiscriminator(in_feature: int, hidden_size: int)
- 功能: 区分输入的特征是来自源域还是目标域,源域标签为1,目标域标签为0。
- 参数:
- in_feature(int): 输入特征的维度;
- hidden_size(int): 隐层特征的维度。
- 形状:
- inputs:(minibatch, in_feature);
- outputs: (minibatch, 1)。
- 举例:
- 见 领域对抗损失(DomainAdversarialLoss) 的举例。
二. 领域对抗损失(DomainAdversarialLoss)
dalib.adaptation.dann.DomainAdversarialLoss(domain_discriminator: torch.nn.modules.module.Module, reduction: Optional[str]= 'mean')
- 定义: L o s s ( D s , D t ) = E x i s ⌢ D s l o g [ D ( f i s ) ] + E x j t ⌢ D t l o g [ 1 − D ( f j t ) ] Loss(D_{s},D_{t})=E_{x_{i}^{s}\frown D_{s}}log[D(f_{i}^{s})]+E_{x_{j}^{t}\frown D_{t}}log[1-D(f_{j}^{t})] Loss(Ds,Dt)=Exis⌢Dslog[D(fis)]+Exjt⌢Dtlog[1−D(fjt)]其中,D是领域鉴别器,f是领域的特征。
- 参数:
- domain_discriminator(nn.Module) : 域鉴别器对象,用于预测特征的域;
- reduction(string,Optional) : 指定输出损失的方式,‘none’, ‘sum’,‘mean’,其中’none’指不使用任何降维直接输出,‘sum’、'mean’分别是对损失求和、求均值,默认为求均值。
- 输入:
- f_s (tensor):源域的特征 f s f^{s} fs;
- f_t (tensor) :目标域的特征 f t f^{t} ft。
- 形状:
- f_s, f_t : (N, F)F是输入特征的维度;
- outputs : 默认是标量,但如果reduction是’none’输出的形状是(N,)。
- 举例:
from dalib.modules.domain_discriminator import DomainDiscriminator
from dalib.adaptation.dann import DomainAdversarialLoss
discriminator = DomainDiscriminator(in_feature= 1024, hidden_size= 2048)
loss = DomainAdversarialLoss(discriminator, reduction= 'mean')
f_s, f_t = torch.rand(20, 1024), torch.rand(20, 1024)
output = loss(f_s, f_t)
print(output)
三. 高斯核(GaussianKernel)
dalib.modules.kernels.GaussianKernel(sigma: Optional[float] = None, track_running_stats: Optional[bool] = True, alpha: Optional[float] = 1.0)
- 定义:
- 高斯核 k k k的定义: k ( x 1 , x 2 ) = e x p ( − ∥ x 1 − x 2 ∥ 2 2 σ 2 ) k(x_{1},x_{2})=exp(-\frac{\left \| x_{1}-x_{2} \right \|^{2} }{2\sigma ^{2}} ) k(x1,x2)=exp(−2σ2∥x1−x2∥2) 其中 x 1 , x 2 ∈ R d x_{1},x_{2}\in R^{d} x1,x2∈Rd是一维张量。
- 高斯核矩阵 K K K被定义在 X = ( x 1 , x 2 , . . . x m ) X=(x_{1},x_{2},...x_{m}) X=(x1,x2,...xm)上: K ( x ) i , j = k ( x i , x j ) K(x)_{i,j} = k(x_{i},x_{j}) K(x)i,j=k(xi,xj)
- 在运算中 σ 2 \sigma ^{2} σ2有两种确认方法:
第一种通过下式计算动态获得: σ 2 = α n 2 ∑ i , j ∥ x i − x j ∥ 2 \sigma ^{2} = \frac{\alpha }{n^{2}}\sum _{i,j}\left \| x_{i}-x_{j} \right \| ^{2} σ2=n2αi,j∑∥xi−xj∥2
第二种是直接给定数值。
- 参数:
- sigma(float, optional): 即 σ \sigma σ,默认为None;
- track_running_stats(bool, optional):如果是’True’则用前面的公式计算 σ 2 \sigma^{2} σ2,若为’False’则使用固定的 σ 2 \sigma^{2} σ2,默认为’True’;
- alpha(float, optional):当track_running_stats为’True’时为计算 σ 2 \sigma^{2} σ2提供 α \alpha α。
- 输入:
- X(tensor):输入组X。
- 形状:
- inputs:(minibatch, F) , F是输入特征的维数;
- outputs:(minibatch, minibatch) 。
四. 多核最大均值差异(MK-MMD)
dalib.adaptation.dan.MultipleKernelMaximumMeanDiscrepancy(kernels: Sequence[torch.nn.modules.module.Module], Linear: Optional[bool]= False, quadratic_program: Optional[bool]= False)
- MK-MMD:
- 源域为: D s = { ( x i s , y i s ) } i = 1 n s D_{s}= \left \{ (x_{i}^{s},y_{i}^{s}) \right \}_{i=1}^{n_{s}} Ds={(xis,yis)}i=1ns
- 目标域: D t = { x j t } j = 1 n t D_{t}= \left \{ x_{j}^{t} \right \}_{j=1}^{n_{t}} Dt={xjt}j=1nt
- 它们各自的样本间都符合独立同分布;
- 则MK-MMD的计算公式为: d M K − M M D ( D s , D t ) = ∥ E s [ g ( D s ) ] − E t [ g ( D t ) ] ∥ H k 2 d_{MK-MMD}(D_{s},D_{t})=\left \| E_{s}[g(D_{s})]-E_{t}[g(D_{t})] \right \| ^{2}_{H_{k}} dMK−MMD(Ds,Dt)=∥Es[g(Ds)]−Et[g(Dt)]∥Hk2
- H k H_{k} Hk表示具有特定内核 k k k的 R K H S RKHS RKHS, g ( ∗ ) g(*) g(∗)是与核函数相关的连续映射, E [ ∗ ] E[*] E[∗]是给定分布的期望;
- 应当注意的是,核函数 k k k是被定义为 r r r个不同的半正定核的凸组合,如下形式: k ( x s , x t ) = ∑ i = 1 r β i k i ( x s , x t ) k(x^{s},x^{t})= {\textstyle \sum_{i=1}^{r}}\beta _{i}k_{i}(x^{s},x^{t}) k(xs,xt)=∑i=1rβiki(xs,xt)
- 其中: ∑ i r β i = 1 , β i ≥ 0 {\textstyle \sum_{i}^{r}}\beta _{i}=1,\beta _{i}\ge 0 ∑irβi=1,βi≥0
- 所谓半正定性是核函数的常见的性质(可以联系SVM中的相关概念学习),凸组合是一种线性组合,若满足 λ i ≥ 0 , ∑ i r λ i = 1 \lambda _{i}\ge 0,{\textstyle \sum_{i}^{r}}\lambda _{i}=1 λi≥0,∑irλi=1则 ∑ i r λ i x i {\textstyle \sum_{i}^{r}}\lambda _{i}x_{i} ∑irλixi即为凸组合;
- 使用内核技巧,MK-MMD可以简化计算为: D ^ k ( D s , D t ) = 1 n s 2 ∑ i = 1 n s ∑ j = 1 n s k ( D s i , D s j ) + 1 n t 2 ∑ i = 1 n t ∑ j = 1 n t k ( D t i , D t j ) − 2 n s n t ∑ i = 1 n s ∑ j = 1 n t k ( D s i , D t j ) \hat{D}_{k}(D_{s},D_{t})= \frac{1}{n_{s}^{2}} {\textstyle \sum_{i=1}^{n_{s}}} {\textstyle \sum_{j=1}^{n_{s}}} k(D_{s}^{i},D_{s}^{j}) +\frac{1}{n_{t}^{2}} {\textstyle \sum_{i=1}^{n_{t}}} {\textstyle \sum_{j=1}^{n_{t}}} k(D_{t}^{i},D_{t}^{j}) -\frac{2}{n_{s}n_{t}} {\textstyle \sum_{i=1}^{n_{s}}} {\textstyle \sum_{j=1}^{n_{t}}} k(D_{s}^{i},D_{t}^{j}) D^k(Ds,Dt)=ns21∑i=1ns∑j=1nsk(Dsi,Dsj)+nt21∑i=1nt∑j=1ntk(Dti,Dtj)−nsnt2∑i=1ns∑j=1ntk(Dsi,Dtj)
- 参数:
- Kernel(tuple(nn.Module)): 核方程;
- Linear(bool):是否使用DAN的线性版本,默认不用;
- quadratic_program(bool): 是否使用二次规划求解 β \beta β,默认不用。
- 输入:
- d_s(tensor):源域通过映射所得的特征 D s D_{s} Ds;
- d_t(tensor): 目标域通过映射所得的特征 D t D_{t} Dt。
- 注意它俩必须相同的形状。
- 形状:
- inputs: (minibatch, *) *代表任意数,实际上就是传入的特征维度;
- outputs: 标量。
- 举例:
from dalib.modules.kernels import GaussianKernel
from dalib.adaptation.dan import MultipleKernelMaximumMeanDiscrepancy
feature_dim = 1024
batch_size = 10
kernels = (GaussianKernel(alpha=0.5), GaussianKernel(alpha=1.), GaussianKernel(alpha=2.))
loss = MultipleKernelMaximumMeanDiscrepancy(kernels)
# features from source domain and target domain
z_s, z_t = torch.randn(batch_size, feature_dim), torch.randn(batch_size,feature_dim)
output = loss(z_s, z_t)
print(output)