-
Notifications
You must be signed in to change notification settings - Fork 0
/
search.json
1 lines (1 loc) · 26.7 KB
/
search.json
1
[{"title":"DP形式化定义","url":"/2024/02/09/DP-read/","content":"《the_algorithmic_foundations_of_differential_privacy》读书笔记\r\n随机化算法\r\n单纯形\r\n一个维单纯形是指包含个顶点的凸多面体。一维单纯形为线段,二维单纯形为三角形,三维单纯形为一个四面体。\r\n概率单纯形\r\n概率单纯形是一个数学空间,每个点代表有限个互斥事件之间的概率分布,下图是三个事件发生的概率分布的二维单纯形,上面每个点在三个事件上发生的概率之和为1\r\n\r\nimage\r\n\r\n给定一个离散集合,上的概率单纯形定义为 是一个集合,集合中的每个元素都是一个维向量,该向量的范式为1,表示以一个离散型随机变量的概率分布,代表了一个有种取值的离散型随机变量的所有可能的概率分布。\r\n随机化算法\r\n一个随机化算法有定义域、离散的值域。一个输入,算法的输出是一个随机变量,服从如下概率分布\r\n\r\n\r\n,,设中包含三个元素,分别是、、,即 \r\n每个元素均代表算法输出的随机变量取值为1,2,3,4,5的概率分布,则可以规定映射为,,。\r\n也就是说,一个特定输入经过随机化算法得到的不是一个具体值,而是一个随机变量,算法以一定概率输出某一个值。\r\n\r\nKL散度(KL-Divergence)\r\nKL散度概念来自于概率论和信息论,又称作相对熵,互熵。从统计学意义上来说,KL散度可以衡量两个分布之间的差异程度。\r\n熵:无损编码事件信息的最小平均编码长度。\r\n\r\n通俗的说,如果熵比较大,则对该信息进行编码的最小平均编码长度较长,意味着该信息具有较多可能的状态,即有着较大的信息量/混乱程度。从某种角度来看,熵描述了一个概率分布的不确定性。\r\n\r\n一个离散的随机变量可能的取值,即取值空间为,概率分布律为,则熵定义为: 其中表示用概率分布来计算期望,规定当时,。\r\n其中表示状态的最小编码长度,熵是在计算最小编码长度的期望。\r\n\r\n上面的量也记为;\r\n以2为底时,熵单位为bit,以e为底时,熵单位为nat;\r\n\r\n交叉熵:熵的计算是已知各状态的概率分布求其理论上最小平均编码长度。如果不知道各状态真实的概率分布,只有预估的概率分布,则只能求预估分布的最小编码长度。假设经过观测后得到了真实概率分布,则在计算预估最小编码长度的期望时可以采用真实概率分布,求得交叉熵\r\n对于同一取值空间下的离散随机变量,概率分布分别为,交叉熵定义为: 换言之,用预估概率分布计算每个状态的最小编码长度,用真实概率分布求期望。具有下述性质: \r\nKL散度:用于衡量交叉熵与熵之间的差异,也是两个随机分布之间距离的度量。\r\n对于同一取值空间下的离散随机变量,概率分布分别为,相对的KL散度定义为: 注意: 最大散度:两个分布比值的最大值\r\n对于同一取值空间下的离散随机变量,概率分布分别为,相对的最大散度定义为: \r\n差分隐私定义\r\n差分隐私是Dwork在2006年首次提出的一种隐私定义,函数的输出结果对数据集中任何特定记录都不敏感。\r\n假设对于一个考试成绩数据集,通过查询操作得知有个同学不及格,现登入一个新同学的成绩后得到相邻数据集,查询得到个同学不及格,由此可以推理得到新加入的同学成绩不及格。\r\n应对上述攻击,差分隐私机制通过向查询结果,中加入随机噪声得到,使得经过同一查询后得到的结果并非确定的具体值,而是两个相似的概率分布的随机变量,这样攻击者无法辨别查询结果来自哪个数据集,保障了个体级别的隐私性。\r\n数据库间的距离:将数据库的范式距离表示为,定义为: 则数据库和之间的距离为,数据库的距离表示数据库的大小,所以该距离表示数据库和之间相差的记录数量,\r\n相邻数据集:距离相差为1的数据库为相邻数据集。\r\n随机化算法:对于特定输入,随机化算法的输出不是固定值而是随机变量。\r\n隐私预算:用于控制算法的隐私保护程度,越小,隐私保护程度越大。\r\n隐私损失:对于任意输出结果,或,描述了随机化算法在邻接数据集上输出同一个值的概率差别大小,差分隐私机制将算法的隐私损失控制在有限范围内。\r\n:对于相邻数据集,施加随机化算法,对于所有,若有 即 则算法满足。其中是随机算法映射结果随机变量的取值空间(概率单纯形),是其子集。\r\n\r\n差分隐私的目的是使相邻数据集在随机化算法中的输出的分布尽可能相似,可以用最大散度来衡量这两个分布的差异:\r\n\r\n使最大散度尽可能小,也就是隐私损失尽可能小,其上限为隐私预算,取的底为: 即可得到定义。\r\n\r\n:加入松弛项的算法,表示失败概率,是一个小常数 \r\n","categories":["差分隐私"],"tags":["差分隐私 论文阅读"]},{"title":"Tensorflow实现逻辑回归联邦学习","url":"/2024/02/08/fl-logistic/","content":"前言\r\n使用Tensorflow简单实现逻辑回归的联邦学习,训练mnist数据集。\r\n运行环境\r\npython 3.7.5tensorflow 1.14.0\r\n共有客户端、服务器、数据集处理以及模型四个代码文件\r\ndatasets.py\r\nimport numpy as npfrom tensorflow.examples.tutorials.mnist import input_dataclass BatchGenerator: def __init__(self, x, yy): self.x = x self.y = yy self.size = len(x) self.random_order = list(range(len(x))) np.random.shuffle(self.random_order) self.start = 0 return def next_batch(self, batch_size): perm = self.random_order[self.start:self.start + batch_size] self.start += batch_size if self.start > self.size: self.start = 0 return self.x[perm], self.y[perm] # support slice def __getitem__(self, val): return self.x[val], self.y[val]class Dataset(object): def __init__(self, split = 0): minist = input_data.read_data_sets('data/', one_hot=True) x_train = minist.train.images y_train = minist.train.labels x_test = minist.test.images y_test = minist.test.labels print("Dataset: train-%d, test-%d" % (len(x_train), len(x_test))) if split == 0: self.train = BatchGenerator(x_train, y_train) else: self.train = self.splited_batch(x_train, y_train, split) self.test = BatchGenerator(x_test, y_test) def splited_batch(self, x_data, y_data, split): res = [] for x, y in zip(np.split(x_data, split), np.split(y_data, split)): assert len(x) == len(y) res.append(BatchGenerator(x, y)) return res\r\n首先定义BatchGenerator 类,用于生成数据的批次。\r\n定义Dataset 类用于加载 MNIST\r\n数据集并创建训练和测试的BatchGenerator 类。\r\n采用tensorflow\r\nsample所带的mnist数据集的预处理脚本input_data.py实现了数据集的读取和向量化。数据读取时采用one-hot编码形式。\r\n\r\none-hot是特征提取中的一种映射编码方式,当特征是分类值时如手写数字识别中的0-9,可以采用数字[0,9]进行编码,但是当求距离时0和9之间的距离很远(距离相差9),不合适。因此可以用[1\r\n0 0 0 0 0 0 0 0 0]表示9,用[0 0 0 0 0 0 0 0 0 1]表示0。\r\n\r\nmodels.py\r\nimport tensorflow as tfdef logistic_regression_model(input_shape, num_classes, learning_rate, graph): with graph.as_default(): X = tf.placeholder(tf.float32, input_shape, name='X') Y = tf.placeholder(tf.float32, [None, num_classes], name='Y') DROP_RATE = tf.placeholder(tf.float32, name='drop_rate') flattened = X # Logistic Regression Layer logits = tf.layers.dense(flattened, num_classes, activation=None, name='logits') # loss and optimizer loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=Y)) optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate) train_op = optimizer.minimize(loss_op) # Evaluate model prediction = tf.nn.softmax(logits) pred = tf.argmax(prediction, 1) # accuracy correct_pred = tf.equal(pred, tf.argmax(Y, 1)) accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) return X, Y, DROP_RATE, train_op, loss_op, accuracy\r\nmodels.py用于建立服务器端和客户端训练或测试用的模型,这部分代码与一般的tensorflow实现逻辑回归大致一致\r\nclient.py\r\nclient端的任务:\r\n\r\n创建并训练tensorflow\r\n将server端发送的模型变量加载到本地模型上\r\n用自己的数据集更新当前模型\r\n将更新后的模型变量发送到server\r\n\r\nimport tensorflow as tfimport numpy as npfrom collections import namedtupleimport mathfrom models import logistic_regression_modelfrom datasets import Dataset# 定义模型FedModel = namedtuple('FedModel', 'X Y DROP_RATE train_op loss_op acc_op')class Clients: def __init__(self, input_shape, num_classes, learning_rate, clients_num): self.graph = tf.Graph() self.sess = tf.Session(graph=self.graph) # 调用函数创建逻辑回归模型 net = logistic_regression_model(input_shape, num_classes, learning_rate, self.graph) self.model = FedModel(*net) # initialize with self.graph.as_default(): self.sess.run(tf.global_variables_initializer()) # 加载mnist数据集 self.dataset = Dataset(split=clients_num) def run_test(self, num): with self.graph.as_default(): batch_x, batch_y = self.dataset.test.next_batch(num) feed_dict = { self.model.X: batch_x, self.model.Y: batch_y, self.model.DROP_RATE: 0 } return self.sess.run([self.model.acc_op, self.model.loss_op], feed_dict=feed_dict) def train_epoch(self, cid, batch_size=32, dropout_rate=0.5): """ Train one client with its own data for one epoch cid: Client id """ dataset = self.dataset.train[cid] with self.graph.as_default(): for _ in range(math.ceil(dataset.size / batch_size)): batch_x, batch_y = dataset.next_batch(batch_size) feed_dict = { self.model.X: batch_x, self.model.Y: batch_y, self.model.DROP_RATE: dropout_rate } self.sess.run(self.model.train_op, feed_dict=feed_dict) def get_client_vars(self): """ Return all of the variables list """ with self.graph.as_default(): client_vars = self.sess.run(tf.trainable_variables()) return client_vars def set_global_vars(self, global_vars): """ Assign all of the variables with global vars """ with self.graph.as_default(): all_vars = tf.trainable_variables() for variable, value in zip(all_vars, global_vars): variable.load(value, self.sess) def choose_clients(self, ratio=1.0): """ randomly choose some clients """ client_num = self.get_clients_num() choose_num = math.ceil(client_num * ratio) return np.random.permutation(client_num)[:choose_num] def get_clients_num(self): return len(self.dataset.train)\r\n__init__方法加载逻辑回归模型和mnist数据集。\r\nrun_test方法对模型进行测试\r\ntrain_epoch方法对模型进行一个epoch的训练\r\nget_client_vars方法通过tf.trainable_variables()方法获取模型的参数信息,用于传送给server端进行聚合\r\nset_global_vars方法用将本地模型参数设置为从server处获得的全局模型参数\r\nchoose_clients方法按照设定的比例选取参与协作训练的客户端\r\nserver.py\r\n服务器的任务:\r\n\r\n将全局模型参数传递给客户端进行训练,并接收每个客户端传回的新的模型参数\r\n对传回的模型参数进行聚合,称为新一轮的全局模型参数\r\n\r\nimport tensorflow as tffrom tqdm import tqdmfrom client import Clientsdef buildClients(num): learning_rate = 0.0001 num_input = 28 # image shape: 28 * 28 num_classes = 10 # minist total classes (0-9 digits) # create Client and model return Clients(input_shape=[None, num_input * num_input], num_classes=num_classes, learning_rate=learning_rate, clients_num=num)def run_global_test(client, global_vars, test_num): client.set_global_vars(global_vars) acc, loss = client.run_test(test_num) print("[epoch {}, {} inst] Testing ACC: {:.4f}, Loss: {:.4f}".format( ep + 1, test_num, acc, loss))#### SOME TRAINING PARAMS ####CLIENT_NUMBER = 50CLIENT_RATIO_PER_ROUND = 0.40epoch = 720#### CREATE CLIENT AND LOAD DATASET ####client = buildClients(CLIENT_NUMBER)#### BEGIN TRAINING ####global_vars = client.get_client_vars()for ep in range(epoch): # We are going to sum up active clients' vars at each epoch client_vars_sum = None # Choose some clients that will train on this epoch random_clients = client.choose_clients(CLIENT_RATIO_PER_ROUND) # Train with these clients for client_id in tqdm(random_clients, ascii=True): # Restore global vars to client's model client.set_global_vars(global_vars) # train one client client.train_epoch(cid=client_id) # obtain current client's vars current_client_vars = client.get_client_vars() # sum it up if client_vars_sum is None: client_vars_sum = current_client_vars else: for cv, ccv in zip(client_vars_sum, current_client_vars): cv += ccv # obtain the avg vars as global vars global_vars = [] for var in client_vars_sum: global_vars.append(var / len(random_clients)) # run test on 600 instances run_global_test(client, global_vars, test_num=600)#### FINAL TEST ####run_global_test(client, global_vars, test_num=10000)\r\n首先定义联邦学习的总体参数,设置了50个客户端,每次选取40%的客户端进行训练,共进行720个epoch。\r\n然后通过buildClients方法创建Clients实例\r\n之后进行训练\r\n\r\n在每个 epoch 中,随机选择一部分客户端参与训练。\r\n每个客户端训练一轮,并将模型的参数进行求和平均,作为全局模型的新参数。\r\n在每个 epoch\r\n结束后,使用全局模型在测试集上进行测试并输出准确率和损失。\r\n\r\n训练结束后输出模型准确率和损失\r\n训练效果如下\r\n\r\nimage\r\n\r\n","categories":["联邦学习"],"tags":["联邦学习 逻辑回归"]},{"title":"《Differential Privacy》阅读","url":"/2024/02/08/Differential-Privacy-read/","content":"前言\r\n该文章主要注重数据库中的隐私保护。差分隐私主要应用于在数据库统计信息揭露的背景下——提供一组用户的准确统计信息,同时保护每个人的隐私。差分隐私要求一组数据的统计信息与任何个人是否选择加入或退出数据集无关。\r\n数据库是一组行,每行包含一个人的数据。选择加入或退出数据库意味着最多只有一行不同的两个数据库,表示为,。一个数据库是另一个数据库的子集。\r\n定义\r\n严格差分隐私\r\n一个随机函数 \r\n,使得其在两个相邻的数据集 、\r\n上得到的任意相同输出集合S的概率满足\r\n\r\n则称随机函数 满足\r\n ,其中 \r\n被称为隐私预算,越小越能产生更强的隐私保证。\r\n宽松差分隐私\r\n一个随机函数 \r\n,使得其在两个相邻的数据集 、\r\n上得到的任意相同输出集合S的概率满足\r\n\r\n则称随机函数 满足\r\n ,其中\r\n\r\n被称为隐私预算,越小越能产生更强的隐私保证;\r\n为松驰项,通常非常小,小于数据库大小的倒数。\r\n函数的 -敏感度\r\n对于查询函数, 敏感度是指:\r\n\r\n-敏感度与-敏感度类似,使用范式定义,常用于深度学习领域的差分隐私\r\n特殊的,当d等于1时,查询函数的输出为1维数据,则 \r\n的敏感度是指函数在相邻数据库上取值之差的最大值。\r\n\r\n若为数量查询,则是数据库中满足特定属性的行数,敏感度为1\r\n若是直方图查询,其中可能的数据库的行的范围被划分为某个数量为k的类,且是整数的k元组,用于指示中K个类中每个类的行数。则的敏感度也为1。(增加或删除一行只会导致一个类的行数减1,其他类的变化都为0)\r\n\r\n拉普拉斯分布(Laplace)\r\n概率密度: \r\n标准Laplace:\r\n\r\n期望为,方差为\r\n拆开绝对值是两个对称的指数分布\r\n\r\nimg\r\n\r\n当,x处的概率密度与成正比,且随着变小,分布更加平坦。由此得到下述方案\r\n方案\r\n对于函数,将独立生成分布为的噪声添加到d中每个输出项的机制享有。\r\n该噪声与数据库及其大小无关。\r\n证明:\r\n相当于在函数上添加一个噪声b,且b服从 \r\n\r\n","categories":["差分隐私"],"tags":["差分隐私 论文阅读"]},{"title":"markdown 教程","url":"/2024/02/08/markdown/","content":"\r\nMarkdown\r\n是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档。\r\nMarkdown 语言在 2004 由约翰·格鲁伯(英语:John Gruber)创建。 Markdown\r\n编写的文档可以导出 HTML 、Word、图像、PDF、Epub 等多种格式的文档。\r\nMarkdown 编写的文档后缀为 .md, .markdown。\r\n\r\n\r\n标题\r\n👆 看起来就像上面这个。Markdown 标题有两种格式。\r\n使用 = 和\r\n- 标记一级和二级标题\r\n= 和 - 标记语法格式如下:\r\n我展示的是一级标题=================我展示的是二级标题-----------------\r\n使用 # 号标记\r\n使用 # 号可表示 1-6 级标题,一级标题对应一个\r\n# 号,二级标题对应两个 # 号,以此类推。\r\n# 一级标题## 二级标题### 三级标题#### 四级标题##### 五级标题###### 六级标题\r\n段落样式\r\nMarkdown\r\n段落没有特殊的格式,直接编写文字就好,段落的换行是使用两个以上空格加上回车。\r\n当然也可以在段落后面使用一个空行来表示重新开始一个段落。\r\n字体\r\nMarkdown 可以使用以下几种字体:\r\n\r\n斜体文本 粗体文本\r\n粗斜体文本\r\n\r\n*斜体文本*_斜体文本_**粗体文本**__粗体文本__***粗斜体文本***___粗斜体文本___\r\n分隔线\r\n可以在一行中用三个以上的星号、减号、底线来建立一个分隔线,行内不能有其他东西。\r\n也可以在星号或是减号中间插入空格。下面每种写法都可以建立分隔线:\r\n\r\n\r\n我\r\n\r\n裂\r\n\r\n开\r\n\r\n了\r\n\r\n\r\n**** * ******- - -----------\r\n删除线\r\n如果段落上的文字要添加删除线,只需要在文字的两端加上两个波浪线\r\n~~ 即可,实例如下:\r\n\r\nRUNOOB.COM GOOGLE.COM BAIDU.COM\r\n\r\nRUNOOB.COMGOOGLE.COM~~BAIDU.COM~~\r\n下划线\r\n下划线可以通过 HTML 的 <u> 标签来实现:\r\n\r\n带下划线文本\r\n\r\n<u>带下划线文本</u>\r\n脚注\r\n脚注是对文本的补充说明。Markdown 脚注的格式如下:\r\n[^要注明的文本]\r\n以下实例演示了脚注的用法:\r\n\r\n阿米娅1\r\n\r\n创建脚注格式类似这样 [^阿米娅][^阿米娅]: 博士,您还有很多事情需要处理。现在还不能休息哦。\r\nMarkdown 列表\r\nMarkdown 支持有序列表和无序列表。\r\n无序列表使用星号(*)、加号(+)或是减号(-)作为列表标记:\r\n\r\n\r\n第一项\r\n第二项\r\n第三项\r\n\r\n\r\n* 第一项* 第二项* 第三项+ 第一项+ 第二项+ 第三项- 第一项- 第二项- 第三项\r\n有序列表使用数字并加上 . 号来表示,如:\r\n\r\n\r\n第一项\r\n第二项\r\n第三项\r\n\r\n\r\n1. 第一项2. 第二项3. 第三项\r\n列表嵌套\r\n列表嵌套只需在子列表中的选项添加四个空格即可:\r\n\r\n第一项:\r\n\r\n第一项嵌套的第一个元素\r\n第一项嵌套的第二个元素\r\n\r\n第二项:\r\n\r\n第二项嵌套的第一个元素\r\n第二项嵌套的第二个元素\r\n\r\n\r\n1. 第一项: - 第一项嵌套的第一个元素 - 第一项嵌套的第二个元素2. 第二项: - 第二项嵌套的第一个元素 - 第二项嵌套的第二个元素\r\nMarkdown 区块\r\nMarkdown 区块引用是在段落开头使用 > 符号\r\n,然后后面紧跟一个空格符号:\r\n\r\n这是一个区块\r\n\r\n> 这是一个区块\r\n另外区块是可以嵌套的,一个 > 符号是最外层,两个\r\n> 符号是第一层嵌套,以此类推:\r\n\r\n最外层\r\n\r\n第一层嵌套\r\n\r\n第二层嵌套\r\n\r\n\r\n\r\n> 最外层> > 第一层嵌套> > > 第二层嵌套\r\n区块中使用列表\r\n区块中使用列表实例如下:\r\n\r\n区块中使用列表\r\n\r\n第一项\r\n第二项\r\n\r\n\r\n第一项\r\n第二项\r\n第三项\r\n\r\n\r\n> 区块中使用列表> 1. 第一项> 2. 第二项> + 第一项> + 第二项> + 第三项\r\n列表中使用区块\r\n如果要在列表项目内放进区块,那么就需要在 >\r\n前添加四个空格的缩进。 区块中使用列表实例如下:\r\n\r\n第一项\r\n\r\n菜鸟教程 学的不仅是技术更是梦想\r\n\r\n第二项\r\n\r\n* 第一项 > 菜鸟教程 > 学的不仅是技术更是梦想* 第二项\r\nMarkdown 代码\r\n如果是段落上的一个函数或片段的代码可以用反引号把它包起来(`),例如:\r\nprintf() 函数\r\n`printf()` 函数\r\n代码区块\r\n代码区块使用 4 个空格或者一个制表符(Tab 键)。 也可以用 ```\r\n包裹一段代码,并指定一种语言(也可以不指定): 实例如下:\r\n$(document).ready(function () { alert('RUNOOB');});\r\nMarkdown 链接\r\n链接使用方法如下:\r\n\r\n链接名称 或者直接使用链接地址 https://github.com/Yue-plus\r\n\r\n[链接名称](链接地址)<https://github.com/Yue-plus>\r\n高级链接\r\n可以通过变量来设置一个链接,变量赋值在文档末尾进行:\r\n\r\n这个链接用 1 作为网址变量 Google 这个链接用 mysite\r\n作为网址变量 Yue_plus\r\n\r\n这个链接用 1 作为网址变量 [Google][1]这个链接用 mysite 作为网址变量 [Yue_plus][mysite]然后在文档的结尾为变量赋值(网址) [1]: http://www.google.com/ [mysite]: https://github.com/Yue-plus\r\nMarkdown 图片\r\nMarkdown 图片语法格式如下:\r\n![alt 属性文本](图片地址)![alt 属性文本](图片地址 \"可选标题\")\r\n开头一个感叹号 ! 接着一个方括号,里面放上图片的替代文字\r\n接着一个英文括号,里面放上图片的网址,最后还可以用引号包住并加上选择性的\r\n'title' 属性的文字。\r\n\r\n\r\n罗德岛集结\r\n\r\n\r\n![罗德岛集结](https://ak.hypergryph.com/upload/images/20190228/118078295785f64dac736c6ade50bb76.jpg \"罗德岛集结\")\r\n当然,你也可以像网址那样对图片网址使用变量:\r\n这个链接用 `2` 作为网址变量 [凯尔希][2].然后在文档的结尾为变量赋值(网址)[2]: https://ak.hypergryph.com/upload/images/20190228/143666074a406ecaa6cd4271dc7c5127.jpg\r\nMarkdown\r\n还没有办法指定图片的高度与宽度,如果需要的话,也可以使用普通的\r\n<img> 标签。\r\n\r\n\r\n\r\n<img src=\"https://ak.hypergryph.com/assets/index/images/ak/common/story/item_infected.png\" width=\"200px\">\r\nMarkdown 表格\r\nMarkdown 制作表格使用 | 来分隔不同的单元格,使用\r\n- 来分隔表头和其他行。 语法格式如下:\r\n\r\n\r\n\r\n表头\r\n表头\r\n\r\n\r\n\r\n\r\n单元格\r\n单元格\r\n\r\n\r\n单元格\r\n单元格\r\n\r\n\r\n\r\n| 表头 | 表头 || ---- | ---- || 单元格 | 单元格 || 单元格 | 单元格 |\r\n可以设置表格的对齐方式:\r\n-: 设置内容和标题栏居右对齐。 :-\r\n设置内容和标题栏居左对齐。 :-:\r\n设置内容和标题栏居中对齐。\r\n\r\n\r\n\r\n左对齐\r\n右对齐\r\n居中对齐\r\n\r\n\r\n\r\n\r\n单元格\r\n单元格\r\n单元格\r\n\r\n\r\n单元格\r\n单元格\r\n单元格\r\n\r\n\r\n\r\nMarkdown 高级技巧\r\n##支持的 HTML 元素 不在 Markdown\r\n涵盖范围之内的标签,都可以直接在文档里面用 HTML 撰写。 目前支持的 HTML\r\n元素有:<kbd> <b>\r\n<i> <em> <sup>\r\n<sub> <br>等,如:\r\n\r\n使用 Ctrl+Alt+Del 重启电脑\r\n\r\n使用 <kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>Del</kbd> 重启电脑\r\n转义\r\nMarkdown\r\n使用了很多特殊符号来表示特定的意义,如果需要显示特定的符号则需要使用转义字符,Markdown\r\n使用反斜杠转义特殊字符:\r\n\r\n** 正常显示星号 **\r\n\r\n**文本加粗** \\*\\* 正常显示星号 \\*\\*\r\nMarkdown 支持以下这些符号前面加上反斜杠来帮助插入普通的符号:\r\n\\ 反斜线` 反引号* 星号_ 下划线{} 花括号[] 方括号() 小括号# 井字号+ 加号- 减号. 英文句点! 感叹号\r\n数学公式\r\n当需要在编辑器中插入数学公式时,可以使用两个美元符 $$ 包裹 TeX 或\r\nLaTeX 格式的数学公式来实现。提交后,问答和文章页会根据需要加载 Mathjax\r\n对数学公式进行渲染。如:\r\n\r\n参考 使用\r\nhexo-filter-mathjax 过滤器来显示数学公式\r\n\r\n\r\n可以在行内包含数学公式: 注意单\r\n$ 内部不能有空格! \r\n\r\n可以在行内包含数学公式: $i\\hbar\\frac{\\partial}{\\partial t}\\psi=-\\frac{\\hbar^2}{2m}\\nabla^2\\psi+V\\psi$ 注意单 `$` 内部不能有空格!$$\\begin{eqnarray\\*}\\nabla\\cdot\\vec{E}&=&\\frac{\\rho}{\\epsilon_0}\\\\\\\\\\nabla\\cdot\\vec{B}&=&0\\\\\\\\\\nabla\\times\\vec{E}&=&-\\frac{\\partial B}{\\partial t}\\\\\\\\\\nabla\\times\\vec{B}&=&\\mu_0\\left(\\vec{J}+\\epsilon_0\\frac{\\partial E}{\\partial t}\\right)\\\\\\\\\\end{eqnarray\\*}$$\r\n\r\n\r\n\r\n博士,您还有很多事情需要处理。现在还不能休息哦。↩︎\r\n\r\n\r\n","categories":["记录"],"tags":["markdown"]}]