edimetia3d
Transformer完全改变了2017年后NLP领域的模型方向 从某种意义上说BertGPT等模型都是Transformer模型的变体 虽然模型结构有各种改变 但是其中的一些基本计算单元则变化较小. Transformer几乎就是为了改善计算性能而专门设计的模型. 完全没有RNN之类的循环计算需求 这就极大降低了计算过程中的顺序依赖 可以极大提高并行性. 正是由于Transformer使用到的基本计算单元非常简单 几乎就只有 gemm +-*/ layernorm softmax 也没有奇怪的计算流程 所以原文的作者将其称为一个"简单"的模型是很有道理的. 本文就是简单记录Transfomer中使用到的基本计算单元. 属于未分类分类。作者是edimetia3d。
C++内所说的异常是指:可以预见的非正常状况例如输入的指针为空;而非不可预见的问题例如突然停电或者突然被用户把进程kill掉并不是C++需要处理的"异常" 异常特性会导致程序的执行流程不可控且往往对OS及runtime有一定的要求(可移植性差)所以没有特殊需求时不应当使用这个特性. throw-try-catch是异常系统的典型三个环节. 异常抛出后寻找catch的过程称为栈展开被展开的函数栈内所有局部对象都将被销毁因此抛出的异常对象必须不依赖局部对象. 标准库内提供了以exception为基类的若干异常我们可以使用这个类也可以自定义类该类的const char * what()成员用于给用户提供信息. catch时优先使用引用 从而保证能派生类实例能绑定到基类参数上. 属于C++系列分类,被贴了 c++、excpetion 标签。作者是edimetia3d。
这一部分主要介绍左值右值引用拷贝和移动.这些可以说是C++11显著区别于以前的C++(还有C)的特性.本文主要从易用的角度介绍值类型(值类型实际要更多一些). 对于自定义类拷贝与移动的实现有基本的准则(非硬性)这些准则是: 拷贝:不应对源对象做任何修改. 移动:可以对源对象做修改但是源对象被修改后必须可以被赋值且可以安全的析构. 对于同时支持拷贝和移动的类型我们一般认为移动操作的性能开销应该优于拷贝. 属于C++系列分类,被贴了 c++、copy、move、reference、引用、拷贝、移动 标签。作者是edimetia3d。
首先上结论: 当涉及浮点数比较时一定要考虑比较符号两侧都是inf的情况. 原因: inf==infinf<=infinf>=inf 这三个比较都为真(-inf同理)而这种结果可能与我们的期望不符. 1. 如果为真是可以接受的那么直接使用比较运算符例如a<=b 2. 如果为真是不可以接受的那么应当使用作差例如(a-b)<=0 这种情况下当a和b都为inf时inf之间的运算会输出NaN从而导致比较结果为false 例如我有这样一个应用场景: 有射线R和两个平面S0及S1我们需要求射线R与平面S0的交点p0以及射线R与平面S1的交点P1. 且要求p0不能比p1离射线起点更远(可以重合) 假如我们用直线的参数方程来描述交点显然上面的目标很容易用 t0<=t1 来描述. 此时就可能出现 inf<=inf 的问题. 在我们的场景中 这就意味着直线和两个平面都没有相交 对我们解决的问题而言 这种都不相交的情况是不可接受的 后续的算法无法处理这种情况 因此比较结果应当是false才行. 属于布道、记录分类,被贴了 754、float、IEEE 标签。作者是edimetia3d。