C_Meng PSNA

Never wait for the storm to pass, just dance in the rain.

0%

整体框架

下图展示了用于下载和处理常见网络爬虫数据快照的整个pipline。
首先下载所有WET文件并分组保存为二进制文件,然后计算所有段落的哈希。
接着独立处理WET文件的每个文档:使用二进制文件对段落进行语言识别并计算语言模型困惑度从而删除重复数据。
最后按语言和困惑度分数将文档重新分组为json文件。

数据获取和预处理

Common Crawl每月都会发布通过随机浏览和采样URL获得的网络快照。每个网页都有不同的可用格式:原始(WARC)、UTF-8文本(WET)和元数据(WAT)。

  • WARC(Web ARChive):它是一种用于存储和传输Web资源(例如HTML页面,图像和视频文件等)的文件格式。 WARC文件通常包含HTTP响应和元数据,用于记录Web爬虫收集的信息。
  • WAT(Web Archive Transformation):它是一种元数据文件格式,用于描述WARC文件中记录的Web内容。 WAT文件通常包含URL,域名和其他有关记录的元数据信息。
  • WET(Web Extraction Toolkit):它是一种将HTML页面转换为文本格式的文件格式。 WET文件通常包含从HTML页面中提取的文本内容,但不包括图像和其他资源。

特点:1. 每月快照之间几乎没有内容重叠。2. 完整的数据包由8年来收集的数PB的数据组成。3. 网页是从整个网站上无限制地抓取的,包含有许多不同的语言。4. 文本的质量也有很大的差异。

每个快照包含 20 到 30TB 的未压缩纯文本,相当于大约 30 亿个网页(例如,2019 年 2 月的快照包含 24TB 的数据)。可以独立下载和处理每个快照。对于每个快照,将 WET 文件重新分组为每个 5GB 的shard。
这些shards被保存到JSON文件中,其中一个条目对应一个网页。

去重

包括删除快照中不同网页中的重复段落,因为它们占文本的 70%。
首先通过将所有字符小写、用占位符(即 0)替换数字并删除所有 Unicode 标点符号和重音符号来标准化每个段落。
然后,重复数据删除通过两个独立的步骤完成。
首先,对于每个shard,我们计算每个段落的哈希码并将它们保存到二进制文件中。我们使用规范化段落的 SHA-1 的前 64 位作为密钥。
然后,我们通过将每个shard与所有二进制文件或其子集进行比较来消除重复数据。

这些步骤对于每个shard来说都是独立的,因此可以进行分布式。除了删除网络副本之外,此步骤还删除了许多样板文件,例如导航菜单、cookie 警告和联系信息。
特别是,它从其他语言的网页中删除了大量的英语内容。
这使得我们pipline的下一步的语言识别更加强大。

语言识别

包括按语言拆分数据。
这里使用来自 fastText ,改语言分类器在Wikipedia,Tatoeba和SETimes上进行了训练。
它使用字符 n-gram 作为特征,并使用分层softmax。
它支持 176 种语言,并在 [0, 1] 范围内为每种语言输出分数。它在单个 CPU 内核上每秒处理 1k 个文档。
对于每个网页,我们计算出最可能的语言和相应的分类器分数。如果该分数高于0.5,我们将文档分类为相应的语言。
否则语言没有明确标识,我们丢弃相应的页面。

基于语言模型的质量过滤

至此仍然存在内容质量低下的文档。
过滤掉这些样本的一种方法是计算网页与目标域(例如维基百科)的相似度分数。
此处建议使用在目标领域训练的语言模型的困惑度作为质量得分。

更准确地说,对于每种语言,根据目标域的数据训练一个tokenizer和语言模型。
这里使用 KenLM 库中实现的 5-gram Kneser-Ney 模型,因为它可以高效地处理大量数据。
然后,对数据集中的每个页面进行tokenization,并使用语言模型计算每个段落的困惑度。
困惑度越低,数据越接近目标域。
在此步骤结束时,每种语言被分平均地分为头、中、尾三个部分,对应于困惑度分数。

进一步过滤

通过维基百科参考的页面和随机抽样的页面,训练一个MLP作为discriminator,来判断输入的页面是否为维基百科参考页面。
训练完成后通过改判别器丢弃一部分非参考页面。

reference:
Wenzek, Guillaume, Marie-Anne Lachaux, Alexis Conneau, Vishrav Chaudhary, Francisco Guzmán, Armand Joulin, and Edouard Grave. “CCNet: Extracting high quality monolingual datasets from web crawl data.” arXiv preprint arXiv:1911.00359 (2019).
https://www.datalearner.com/blog/1051682313146748

references:
https://www.v7labs.com/blog/neural-networks-activation-functions#:~:text=An%20Activation%20Function%20decides%20whether,prediction%20using%20simpler%20mathematical%20operations.
https://blog.csdn.net/weixin_45134475/article/details/123672283
https://zhuanlan.zhihu.com/p/92412922

Sigmoid

$\sigma(x) = \frac{1}{1+e^{-x}}$

Tanh

$tanh(x) = \frac{1-e^{-2x}}{1+e^{-2x}}$

ReLU

$ReLU(x)=\left\lbrace\begin{array}{cll}
x & , & x \ge 0 \\
0 & , & x < 0
\end{array}\right.$

$ReLU(x) = \max(0, x)$

Leaky ReLU

$ReLU(x)=\left\lbrace\begin{array}{cll}
x & , & x \ge 0 \\
0.1x & , & x < 0
\end{array}\right.$

$ReLU(x) = \max(0.1x, x)$

ELU

$ELU(x)=\left\lbrace\begin{array}{cll}
x & , & x \ge 0 \\
\alpha(e^x-1) & , & x < 0
\end{array}\right.$

Swish

$swish(x) = x*sigmoid(x) =\frac{x}{1+e^{-x}}$

Maxout

$max(z_1, z_2, …)$

Softmax

$softmax(z_i) = \frac{e^{z_i}}{\sum_j e^{z_j}}$

通过mac自带的磁盘工具调整虚拟磁盘大小会报错,但是可以通过命令行调整。

如将Hello.dmg调整为7GB:

1
hdiutil resize -size 7g Hello.dmg

将YOURNOTEBOOKNAME替换为需要转换的文件名称,运行以下命令即可

1
jupyter nbconvert --to script YOURNOTEBOOKNAME.ipynb

如果使用了anaconda环境,且未将其设置为默认环境的话,可以在jupyter命令前补充安装路径。

以安装路径为“~/opt/anaconda3”为例:

1
~/opt/anaconda3/bin/jupyter nbconvert --to script YOURNOTEBOOKNAME.ipynb

向量表示

量子计算的基本单位是量子比特,量子比特用向量 $|\psi\rangle$ (狄拉克Dirac符号)来描述。

基态: $|g\rangle=|1\rangle=\left[ \begin{matrix} 0 \\ 1 \end{matrix} \right]$

激发态: $∣e\rangle=|0\rangle=\left[ \begin{matrix} 1 \\ 0 \end{matrix} \right]$

在量子理论中,描述量子态的向量称为态矢,态矢分为左矢和右矢。相同描述对象的左矢和右矢互为转置共轭。

pyqpanda中,dagger()函数可用于对逻辑门进行转置共轭操作

右失(ket): $|\psi\rangle=\left[ \begin{matrix} c_1 & c_2 & \cdots & c_n \end{matrix} \right]^T=\left[ \begin{matrix} c_1 \\ c_2 \\ \vdots \\ c_n \end{matrix} \right]$

左失(bra): $\langle\psi|=\left[ \begin{matrix} c_1^* & c_2^* & \cdots & c_n^* \end{matrix} \right]$

并不是任意的二维向量都能用来描述一个qubit的状态,描述量子态的向量的模长必须为1,所谓向量的模长定义如下:

​ $M(\alpha) = \sqrt{|a_{1}|^{2} + |a_{2}|^{2} + … + |a_{n}|^{2}}$

量子比特各维度的平方为量子处于该状态的概率。

向量计算

对于一组向量 $|u_1\rangle, |u_2\rangle, \cdots, |u_n\rangle$ 张成(spanning)的 $n$ 维空间 $C^n$ ,空间中的任意向量可以表示为: $|v\rangle=\sum_i x_i u_i$ ,这个集合 ${|u_1\rangle, |u_2\rangle, \cdots, |u_n\rangle}$ 就称为 $C^n$ 的基(basis)。

内积

在 $C^n$ 上的内积表示为(注意 $a_i^*$ 为 $a_i$ 的共轭!):

$\langle \alpha | \beta \rangle = (|\alpha\rangle, |\beta\rangle) = ((a_1, \cdots ,a_n),(b_1, \cdots, b_n)) = \sum_{i=1}^{n}a_i^*b_i$

可以看做 $\langle \alpha|$ 共轭转置后得到的 $1 \times n$ 的矩阵与 $| \beta \rangle$ 构成的 $n \times 1$ 的矩阵的积,内积的结果是一个值。

外积

外积 $| \alpha \rangle \langle \beta |$ 可以看做 $\langle \alpha|$ 的 $n \times 1$ 的矩阵与 $| \beta \rangle$ 共轭转置后构成的 $1 \times n$ 的矩阵的积,外积的结果是一个矩阵!

张量积

向量 $|\alpha\rangle$ 、 $|\beta\rangle$ 在 $C^n$ 、 $C^m$ 中的张量积为 $C^{n\times m}$ 中的向量: $|\alpha\rangle\otimes|\beta\rangle=|\alpha\rangle|\beta\rangle=|\alpha\beta\rangle$ ,计算方法为:

$\left[ \begin{matrix} a_1 \\ a_2 \end{matrix} \right]\times\left[ \begin{matrix} b_1 \\ b_2 \end{matrix} \right] = \left[ \begin{matrix} a_1 b_1 \\ a_1 b_2 \\ a_2 b_1 \\ a_2 b_2 \end{matrix} \right]$

常用算子(常见量子逻辑门)矩阵形式

单比特量子逻辑门

当单比特量子逻辑门作用于量子比特时,为门在前比特在后进行矩阵相乘,进而改变比特状态。

其中:

  • $I$ 门不改变比特状态
  • $Hadamard$ 门可以使量子比特进入混沌态,即激发与否的概率均为一半
  • $Pauli-X$ 会使量子状态翻转
  • 量子的状态改变通常通过旋转实现

多比特量子逻辑门

当多比特量子逻辑门作用于多个量子比特时,为门在前,多个量子比特的张量积在后,进行矩阵相乘。

量子线路图

基本约定

在关系图中,每条实线都描述一个量子比特,更常见地是描述一个量子比特寄存器。按照约定,最上面那根线是量子比特寄存器0,其余的按顺序标记。根据描述,上面的示例线路作用于两个量子比特(或等效为作用于两个寄存器,每个寄存器由一个量子比特组成)。作用于一个或多个量子比特寄存器的门用一个框表示。例如,符号

量子门按时间顺序排列,最左侧的门是应用于量子比特的第一个门。 也就是说,如果你将线描述为包含量子态,那么这些线将按图中从左到右的顺序带着量子态通过每个门。 也就是说

是酉矩阵 $CBA$ 。矩阵乘法遵守相反的约定,即最先应用最右侧的矩阵。不过,在量子线路图中,最先应用的是最左侧的门。这种差异有时可能会导致混淆,因此有必要记下线性代数表示法和量子关系图之间的这一明显差异。

受控门

多量子比特量子线路图中内置的另一个构造是控制。量子单个受控门表示为 $\Lambda(G)$ ,其中单个量子比特的值控制 $G$ 的应用。要理解该受控门的操作,可查看下面的示例,它是一个乘积态输入 $\Lambda(G)(\alpha|0\rangle+\beta|1\rangle)|\psi\rangle=\alpha|0\rangle|\psi\rangle+\alpha|1\rangle G|\psi\rangle$ 。也就是说,当且仅当控制量子比特采用值时,该受控门才对包含 $\phi$ 的寄存器应用 $G$ 。通常,我们在线路图中将这种受控操作描述为

在这里,黑色圆圈表示门受控的量子位,垂直线表示当控制量子比特采用值1时应用的酉操作。对于 $G=X$ 和 $G=Z$ 的特殊情况,我们引入了以下表示法来描述门的受控版本(请注意,受控 $X$ 门是 $CNOT$ 门):

测量运算符

在线路图中直观呈现的剩余操作是测量。测量采用量子比特寄存器、对其进行测量,然后以经典信息的形式输出结果。测量操作由计量符号表示,它始终将输入看做是一个量子比特寄存器(表示为实线),将输出看做是经典信息(表示为双线)。具体来说,这种子线路如下所示:

References:
https://blog.csdn.net/si_ying/article/details/108303988
https://pyqpanda-toturial.readthedocs.io/
https://docs.microsoft.com/zh-cn/azure/quantum/concepts-circuits
https://www.cxyzjd.com/article/qq_43391414/118766778
https://swardsman.github.io/learning-q-sharp/

本文提炼自:https://zhuanlan.zhihu.com/p/35642367

冠词是置于名词前并限定名词的意义的虚词,分为定冠词和不定冠词,实际使用中,还会出现零冠词,共三种情况。

定冠词:THE

用于表示特指。

一般用法:

  1. 表示特指:特指某(些)人或某(些)物(包括用于上文提到过的人或物之前,以及说话双方都知道的人或物)。如:We have a cat and two dogs. The cat is black and the dogs are white. 我们养了一只猫和两只狗,猫是黑的,狗是白的。
  2. 表示独一无二:用在世界上“独一无二”的事物的名词前。如:The earth goes round the sun. 地球绕着太阳转。
  3. 用于最高级前:即用于形容词或副词的最高级前。如:Who picked the most apples? 谁摘的苹果最多?
  4. 用于序数词或方位词之前。如:He was the first man to think of it. 他是第一个想到这一点的人。
  5. 用于乐器名词前:表示相应乐器的演奏。如:Besides the violin, he plays the piano and the flute. 除了拉提琴,他还能弹钢琴和吹笛子。
  6. 表示人体部位:用于某些介词短语中指身体的某个部位。如:He patted me on the back. 他拍了拍我的背。
  7. 用于表示一家人:用于在姓氏的复数形式之前表示一家人或夫妇二人。如:The Smiths live in the apartment above ours. 史密斯一家住在我们楼上的一套住房里。
  8. 用于江河湖海等前:用于江河湖海、山脉群岛、海湾海峡等地理名词前。如:The Yellow River flows into the Yellow Sea. 黄河流人黄海。
  9. 用于某些含有普通名词的专有名词前:用于某些国名、组织机构、建筑物、报纸杂志、会议条约等含有普通名词与其他词构成的专有名词。如:We visited the Great Wall yesterday. 我们昨天去参观了长城。

其他用法:

  1. 用于整十的复数数词前:表示几十年代。如:This happened in the seventies. 这发生在七十年代。
  2. 用于比较级前:用于“the+比较级,the+比较级”结构中表示“越……就越……”。如:The sooner we operate now the safer. 越早动手术越安全。
  3. 用于表示类别:用于“the+某些形容词或过去分词”中表示一类人。如:Do you think the rich should pay more taxes to help the poor? 你认为富人是否应当多交点税来帮助穷人?
  4. 用于国籍名词前表总称:用于“the+某些国籍的形容词”中表示某国人的总称。如:The French are famous for their food. 法国人因法国菜而出名。
  5. 用于集合名词前表总称:用于“the + police / public等集合名词”中表示这类人的总称。如:The police are looking for the murderer. 警察正在寻找那个凶手。
  6. 用于修饰same, only, very等形容词:即用于“the same / only / very +名词”结构中。如:That’s the only reason. 那是唯一的理由。
  7. 用于单位名词前表标标准:即用于“单位词”(hour, day, month, year, dozen, gallon, ton, yard等)前表示标准,相当于汉语的“按”“论”“每”等。如:They let out cars by the day. 他们按天出租汽车。

但是,by weight(按重量)习惯上不用冠词。如:Bananas are usually sold by weight. 香蕉通常按重量卖。

不定冠词:A、AN

用于表示泛指。

一般用法

  1. 表类别:即指人或事物的类别。如:A teacher is a person who teaches. 教师就是教书的人。
  2. 表数量:即表示数量“一”。如:I’ll be able to finish it in a day or two. 在一两天内我会完成此事。
  3. 表同一性:即表示“同一”,说明事物的同一性质、特征、大小或程度等。如:This hat and that one are of a shape. 这顶帽子和那顶一样大。
  4. 表程度:用于most前表示“非常”“十分”。如:It’s a most boring book. 这是一本非常枯燥乏味的书。

其他用法

  1. 用于序数词前:用在序数词前表示“再一”“又一”。如:She thanked him a second time. 她再次向他道谢。
  2. 用于由动词转化来的名词前:表示一次、一番等义(通常与 have, take, make, give 等动词连用)。如:We’ve already had a try at it. 我们已经试过一下。
  3. 用于专有名词前:相当于a certain,意为“一个”“某个”。如:The house next door has been bought by a Mr Jones. 隔壁的 房子被一个叫琼斯的先生的人买下了。
  4. 用于抽象名词前:使之具体化,表示与该之相关的具体的人或事。如:He was a success in business. 他事业成功。

零冠词

用于表示泛指。

  1. 表泛指的不可数名词或复数名词前。如:Snow was failing. 正在下雪。
  2. 倒装的让步状语从句中:在as(虽然)引导让步状语从句前面的单数可数名词前不用冠词。如:Child as he was, he knew how to help others. 他虽是个孩子,但已知识如何帮助别人。
  3. 某些特殊词前:例如在man(人,人类), word(消息)的前面不用冠词。如:Man is a rational animal. 人是理性的动物。
  4. 又如动词 turn(变成),go(变成)后作表语的名词前通常用不用冠词。如:He was a teacher before he turned writer. 他在成为作家之前是教师。
  5. 独立主格结构中:在表示伴随或补充说明用用的独立主格结构中,名词前不用冠词。如:The teacher came in, book in hand. 老师走进教室,手里拿着书。
  6. “(a) kind [sort] of+名词”结构的“名词”前:该结构中的“名词”不管是单数还是复数,其前都通常用零冠词。如:This kind of book is very interesting. 这种书很有趣。
  7. 表抽象意义的单数名词前:当单数可数名词含义抽象化具有形容词意味时,通常用零冠词。如:I was fool enough to accept his offer. 我接受他的提议真是太傻了。

泡利算符类

泡利算符是一组三个2×2的幺正厄米复矩阵,又称酉矩阵。我们一般都以希腊字母 $\sigma$ 来表示。 在 QPanda 中我们称它们为X门,Y门,Z门。它们对应的矩阵形式如下。

X:
$\sigma_x = \left[\begin{matrix}
0 & 1 \\
1 & 0
\end{matrix}\right]$

Y:
$\sigma_y = \left[\begin{matrix}
0 & -i \\
i & 0
\end{matrix}\right]$

Z:
$\sigma_z = \left[\begin{matrix}
1 & 0 \\
0 & -1
\end{matrix}\right]$

每个抛离矩阵有两个特征值,+1和-1,其对应的归一化特征向量为:

$\psi_{x+}=\frac{1}{\sqrt{2}}\left[\begin{matrix}
1 \\
1
\end{matrix}\right]$

$\psi_{x-}=\frac{1}{\sqrt{2}}\left[\begin{matrix}
1 \\
-1
\end{matrix}\right]$

$\psi_{y+}=\frac{1}{\sqrt{2}}\left[\begin{matrix}
1 \\
i
\end{matrix}\right]$

$\psi_{y-}=\frac{1}{\sqrt{2}}\left[\begin{matrix}
1 \\
-i
\end{matrix}\right]$

$\psi_{z+}=\left[\begin{matrix}
1 \\
0
\end{matrix}\right]$

$\psi_{z-}=\left[\begin{matrix}
0 \\
1
\end{matrix}\right]$

泡利算符的运算规则

  1. 泡利算符与自身相乘得到是单位矩阵
  2. 泡利算符与单位矩阵相乘,无论是左乘还是右乘,其值不变
  3. 顺序相乘的两个泡利算符跟未参与计算的泡利算符是i倍的关系
  4. 逆序相乘的两个泡利算符跟未参与计算的泡利算符是−i倍的关系

接口介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pyqpanda import *

if __name__=="__main__":
# 构造一个空的泡利算符类
p1 = PauliOperator()

# 2倍的"泡利Z0"张乘"泡利Z1"
p2 = PauliOperator("Z0 Z1", 2)

# 2倍的"泡利Z0"张乘"泡利Z1" + 3倍的"泡利X1"张乘"泡利Y2"
p3 = PauliOperator({"Z0 Z1": 2, "X1 Y2": 3})

# 构造一个单位矩阵,其系数为2,等价于p4 = PauliOperator("", 2)
p4 = PauliOperator(2)

其中PauliOperator p2(“Z0 Z1”, 2)表示的是 $2\sigma_{0}^{z} \otimes \sigma_{1}^{z}$ ,这里的 $\otimes$ 表示克罗内克积(Kronecker product),也称作张量积、张乘。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from pyqpanda import *

if __name__=="__main__":

a = PauliOperator("Z0 Z1", 2)
b = PauliOperator("X5 Y6", 3)

plus = a + b
minus = a - b
muliply = a * b

print("a + b = ", plus)
print("a - b = ", minus)
print("a * b = ", muliply)

print("Index : ", muliply.getMaxIndex())

index_map = {}
remap_pauli = muliply.remapQubitIndex(index_map)

print("remap_pauli : ", remap_pauli)
print("Index : ", remap_pauli.getMaxIndex())

reference:
https://pyqpanda-toturial.readthedocs.io/zh/latest/PauliOperator.html
https://www.bilibili.com/video/BV124411b7bd?p=3

最优化问题分为连续性的和离散性的。其中离散性的最优化问题又被称为组合最优化问题

数学表达

$$\begin{split}
\min& f(x) &\leftarrow 目标函数 \\
s.t.& g(x) \geq 0 &\leftarrow 约束条件 \\
& x \in D &\leftarrow 定义域
\end{split}$$

常用求解方法

  1. 各种规划方法(线性,非线性)
  2. 蚁群算法
  3. 遗传算法
  4. 退火算法
  5. 粒子群算法
  6. 神经网络
  7. 搜索算法
  8. 拉格朗日松弛算法
  9. 近似算法