论文阅读 PartialFed: Cross-Domain Personalized Federated Learning via Partial Initialization

1. 背景 & 动机

联邦学习是一种以隐私保护方式进行分布式机器学习的范式。在参数服务器的训练架构下,客户端的数据将保存在本地而不上传到服务器中。在这种情况下,每个客户端的本地数据很可能是异构的(例如非独立同分布),这导致了使用联邦平均算法(FedAvg)训练出的全局模型存在准确率下降等问题。为了应对客户端之间的数据高度异构情况,近年来提出的个性化联邦学习引起了多数学者的兴趣。所谓个性化联邦学习,就是根据客户端本地数据分布的特点,为不同客户端提供一个本地模型而不是直接使用统一的全局模型。

操作系统:16位实模式转32位保护模式

随着计算机硬件的不断发展,可用内存(RAM)也变得越来越大。此外,实模式下缺乏对内存的保护,这导致了由于非法内存访问而产生的一些未知错误。这些问题在保护模式下得到了一定的解决,其作用主要有以下两点:

  1. 支持更大的内存空间寻址
  2. 区分系统程序和用户程序,对访问内存的地址加以限制,防止程序非法访问内存

此外,我们的内存采用的是分段模型,要实现对内存的保护,就是要实现对段的保护。段的相关信息用一个称为段描述符的数据结构去维护,多个段描述符组成全局描述符表(GDT),它们都存放在内存中。

全局描述符表 GDT

将CPU从 16 位实模式切换到 32 位保护模式的最困难部分是,我们必须在内存中准备一个称为全局描述符表(GDT)的复杂数据结构,该结构定义了内存段信息及其保护模式下的额外信息。而 GDT 则是由多个段描述符组成,一个段描述符由 8 bytes 组成,其组成部分有:

  • 段基址,它定义了段在物理内存中的起始位置
  • 段长度,定义了段的大小
  • 标识位,段是否可读写,可执行等

段描述符结构如下图所示:

2021-06-15.9.26.02
2021-06-15.9.26.02

切换步骤

  1. 准备段描述符信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
; GDT

gdt_start:

gdt_null: ; 第一个段描述符强制设置为 0
dd 0x0
dd 0x0

gdt_code: ; the code segment descriptor
; base = 0x0, limit = 0xfffff
; 1st flags: (present)1 (privilege)00 (descriptor type)1 -> 1001b
; type flags: (code )1 ( conforming )0 (readable )1 (accessed )0 -> 1010b
; 2nd flags: ( granularity )1 (32- bit default )1 (64- bit seg )0 (AVL )0 -> 1100b
dw 0xffff ; Limit (bits 0-15)
dw 0x0 ; Base (bits 0-15)
db 0x0 ; Base (bits 16-23)
db 10011010b ; 1st flags , type flags
db 11001111b ; 2nd flags , Limit (bits 16 -19)
db 0x0 ; Base (bits 24-31)

gdt_data: ;the data segment descriptor
; Same as code segment expect for the type flags:
; types flags: (code) 0 (expand down) 0 (writable) 1 (accessed) 0 -> 0010 b
dw 0xffff ; Limit (bits 0 -15)
dw 0x0 ; Base (bits 0-15)
db 0x0 ; Base (bits 16-23)
db 10010010b ; 1st flags , type flags
db 11001111b ; 2nd flags , Limit (bits 16 -19)
db 0x0 ; Base (bits 24-31)

gdt_end: ; The reason for putting a label at the end of the
; GDT is so we can have the assembler calculate
; the size of the GDT for the GDT decriptor (below)

; GDT descriptor
gdt_descriptor:
dw gdt_end - gdt_start - 1 ; Size of GDT
dd gdt_start ; Start address of our GDT


; 设置保护模式下要用到的段地址,代码段和数据段
CODE_SEG equ gdt_code - gdt_start
DATA_SEG equ gdt_data - gdt_start
  1. 加载设置 GDTR 寄存器,使之指向全局段描述符表
1
lgdt [ gdt_descriptor ]
  1. 设置 CR0 寄存器,开启保护模式。
1
2
3
mov eax, cr0 ; 为了使开关进入保护模式,我们将 CR0 的第一位(控制寄存器)置 1
or eax, 0x1
mov cr0, eax
  1. 进行长跳转,加载 CS 段寄存器。
1
jmp CODE_SEG:init_pm

进行长跳转的原因是因为我们无法直接或间接 mov 一个数据到 CS 寄存器中,因为刚刚开启保护模式时,CS 的影子寄存器还是实模式下的值,所以需要告诉 CPU 加载新的段信息。·

MAML: 模型无关的元学习

元学习是目前人工智能领域一个令人振奋的研究领域。大量的研究结果表明元学习已经在人工智能领域上取得了重大突破。基于优化方法的元学习中,MAML可以说是当中最有名的了,它是一种相当通用的优化算法,可以与基于梯度更新的算法兼容。

学堂云 3.0 刷课代码

问题

在学堂云刷课的时候,不能离开这个页面,否则的话视频会暂停。

解决方式

在当前页面调试,并将下面的 js 代码输入带控制台中执行,然后就可以离开页面播放了,同时也可以开多个页面刷视频。

代码写的很烂(边查边写),能用就好。。。

1
setInterval(()=>{document.getElementById('video').play()}, 1000)

用C++和SFML写游戏-探索音频和文本的世界(8)

1. Audio 模块概览

到目前为止,我们已经用过的模块有 window,graphics 和 systemwindow 模块主要用来操作窗口以及设置窗口的属性,graphics 模块为我们在屏幕绘制图形提供了一系列方便的api,在system 模块我们用到了 Time 类和 Class 类。

SFML 中还有两个模块 --- audio 以及 network,后续会会慢慢介绍。

audio 模块中,我们必须掌握的两个类是 Sf::Soundsf::Music。字面意思,两个类都是能够播放一个音频文件的。下面来简单介绍一下两者:

biweekly-contest-16

好久没刷 leetcode,现在居然出了夜喵专场。比赛结束的时候已经凌晨 12 点了。这一场主要的用到的知识有动态规划,BFS。