|
|
@@ -15,17 +15,20 @@
|
|
|
|
|
|
namespace fasttext {
|
|
|
|
|
|
-constexpr int32_t SIGMOID_TABLE_SIZE = 512;
|
|
|
-constexpr int32_t MAX_SIGMOID = 8;
|
|
|
-constexpr int32_t LOG_TABLE_SIZE = 512;
|
|
|
-
|
|
|
-Model::Model(std::shared_ptr<Matrix> wi,
|
|
|
- std::shared_ptr<Matrix> wo,
|
|
|
- std::shared_ptr<Args> args,
|
|
|
- int32_t seed)
|
|
|
- : hidden_(args->dim), output_(wo->m_),
|
|
|
- grad_(args->dim), rng(seed), quant_(false)
|
|
|
-{
|
|
|
+constexpr int64_t SIGMOID_TABLE_SIZE = 512;
|
|
|
+constexpr int64_t MAX_SIGMOID = 8;
|
|
|
+constexpr int64_t LOG_TABLE_SIZE = 512;
|
|
|
+
|
|
|
+Model::Model(
|
|
|
+ std::shared_ptr<Matrix> wi,
|
|
|
+ std::shared_ptr<Matrix> wo,
|
|
|
+ std::shared_ptr<Args> args,
|
|
|
+ int32_t seed)
|
|
|
+ : hidden_(args->dim),
|
|
|
+ output_(wo->m_),
|
|
|
+ grad_(args->dim),
|
|
|
+ rng(seed),
|
|
|
+ quant_(false) {
|
|
|
wi_ = wi;
|
|
|
wo_ = wo;
|
|
|
args_ = args;
|
|
|
@@ -34,15 +37,12 @@ Model::Model(std::shared_ptr<Matrix> wi,
|
|
|
negpos = 0;
|
|
|
loss_ = 0.0;
|
|
|
nexamples_ = 1;
|
|
|
+ t_sigmoid_.reserve(SIGMOID_TABLE_SIZE + 1);
|
|
|
+ t_log_.reserve(LOG_TABLE_SIZE + 1);
|
|
|
initSigmoid();
|
|
|
initLog();
|
|
|
}
|
|
|
|
|
|
-Model::~Model() {
|
|
|
- delete[] t_sigmoid;
|
|
|
- delete[] t_log;
|
|
|
-}
|
|
|
-
|
|
|
void Model::setQuantizePointer(std::shared_ptr<QMatrix> qwi,
|
|
|
std::shared_ptr<QMatrix> qwo, bool qout) {
|
|
|
qwi_ = qwi;
|
|
|
@@ -250,17 +250,17 @@ void Model::initTableNegatives(const std::vector<int64_t>& counts) {
|
|
|
for (size_t i = 0; i < counts.size(); i++) {
|
|
|
real c = pow(counts[i], 0.5);
|
|
|
for (size_t j = 0; j < c * NEGATIVE_TABLE_SIZE / z; j++) {
|
|
|
- negatives.push_back(i);
|
|
|
+ negatives_.push_back(i);
|
|
|
}
|
|
|
}
|
|
|
- std::shuffle(negatives.begin(), negatives.end(), rng);
|
|
|
+ std::shuffle(negatives_.begin(), negatives_.end(), rng);
|
|
|
}
|
|
|
|
|
|
int32_t Model::getNegative(int32_t target) {
|
|
|
int32_t negative;
|
|
|
do {
|
|
|
- negative = negatives[negpos];
|
|
|
- negpos = (negpos + 1) % negatives.size();
|
|
|
+ negative = negatives_[negpos];
|
|
|
+ negpos = (negpos + 1) % negatives_.size();
|
|
|
} while (target == negative);
|
|
|
return negative;
|
|
|
}
|
|
|
@@ -314,18 +314,16 @@ real Model::getLoss() const {
|
|
|
}
|
|
|
|
|
|
void Model::initSigmoid() {
|
|
|
- t_sigmoid = new real[SIGMOID_TABLE_SIZE + 1];
|
|
|
for (int i = 0; i < SIGMOID_TABLE_SIZE + 1; i++) {
|
|
|
real x = real(i * 2 * MAX_SIGMOID) / SIGMOID_TABLE_SIZE - MAX_SIGMOID;
|
|
|
- t_sigmoid[i] = 1.0 / (1.0 + std::exp(-x));
|
|
|
+ t_sigmoid_.push_back(1.0 / (1.0 + std::exp(-x)));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void Model::initLog() {
|
|
|
- t_log = new real[LOG_TABLE_SIZE + 1];
|
|
|
for (int i = 0; i < LOG_TABLE_SIZE + 1; i++) {
|
|
|
real x = (real(i) + 1e-5) / LOG_TABLE_SIZE;
|
|
|
- t_log[i] = std::log(x);
|
|
|
+ t_log_.push_back(std::log(x));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -333,8 +331,8 @@ real Model::log(real x) const {
|
|
|
if (x > 1.0) {
|
|
|
return 0.0;
|
|
|
}
|
|
|
- int i = int(x * LOG_TABLE_SIZE);
|
|
|
- return t_log[i];
|
|
|
+ int64_t i = int64_t(x * LOG_TABLE_SIZE);
|
|
|
+ return t_log_[i];
|
|
|
}
|
|
|
|
|
|
real Model::std_log(real x) const {
|
|
|
@@ -347,8 +345,8 @@ real Model::sigmoid(real x) const {
|
|
|
} else if (x > MAX_SIGMOID) {
|
|
|
return 1.0;
|
|
|
} else {
|
|
|
- int i = int((x + MAX_SIGMOID) * SIGMOID_TABLE_SIZE / MAX_SIGMOID / 2);
|
|
|
- return t_sigmoid[i];
|
|
|
+ int64_t i = int64_t((x + MAX_SIGMOID) * SIGMOID_TABLE_SIZE / MAX_SIGMOID / 2);
|
|
|
+ return t_sigmoid_[i];
|
|
|
}
|
|
|
}
|
|
|
|