npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

embedding-brain

v1.0.0

Published

A neural network library, built to support input embeddings alongside ordinary inputs and output probabilities

Downloads

2

Readme

embedding-brain

A neural network library in Javascript, built to support input embeddings alongside ordinary inputs and output probabilities. Developed for personal explorations in machine learning, with general applicability in mind.

Installation

npm install embedding-brain

This library makes some use of features (only generators, currently) of ECMAScript 6. This means that your version of node must have support either for the --harmony execution flag or come out of the box with support for generators (most recent versions). Please see the node.js documentation for more information

Usage

new NeuralNetwork(options)

Initialize a neural network with the corresponding options and random starting weights.

options = {
	inputVectorSize: Number, // the number of non-embedding input signals to the network. default: 0
	embeddingSizes: [Number], // an array of integer sizes of each desired embedding vector. default: []
	hiddenLayerSizes: [Number], // an array of integer sizes (in node count) for each hidden layer. default [5] (one hidden layer with 5 nodes)
	outputSize: Number, // the number of output signals. default: 2 (for binary classification)
	learningRate: Number, // the learning rate for weight updates during training. default: 0.5
	inputLabels: [String], // string labels for each of the input signals. default: ["0", "1", ...]
	embeddingLabels: [String], // string labels for each input embedding vector. default: ["0", "1", ...]
	outputLabels: [String],  // string labels for each of the output signals. default: ["0", "1", ...]
}

NeuralNetwork#train(labeledInputSignals, labeledEmbeddingVectors, labeledOutputSignals)

Train the neural network, with each input signal taking a value according to the labeled vector, each input embedding taking the vector matching its label, and each output signal taking a value according to the labeled vector. Returns an object of the form:

{
	resultEmbeddings: {
		embeddingLabel: updatedEmbeddingVector
	}
}

for each embedding label and its corresponding updated vector. See example.

NeuralNetwork#predict(labeledInputSignals, labeledEmbeddingVectors)

Compute (softmax) output signals with the neural network, with each input signal taking a value according to the labeled vector and each input embedding taking the vector matching its label. Returns an object of the form:

{
	outputs: {
		outputLabel: outputSignal
	}
}

for each output unit.

NeuralNetwork#reset()

Reset the weights learned in the network to random values.

Utils.Vector.random(n)

Return a vector (array) of n random values between 0 and 1 (exclusive). Useful for initializing embedding vectors before further training.

Example

Run the example with node example.js.

var Brain = require('embedding-brain');
var Utils = Brain.Utils;

// we are going to train a neural network to model the XOR function:
// A | B | f(A, B)
// 0   0   0
// 0   1   1
// 1   0   1
// 1   1   0

// to do this, we'll learn embeddings for each setting of A and B
// each embedding will be a length 5 vector
var nn = new Brain.NeuralNetwork({
	inputVectorSize: 0, // no non-embedding input signals
	embeddingSizes: [5], // one embedding input to the network with length 5
	hiddenLayerSizes: [3], // one hidden layer with 3 nodes
	outputSize: 2, // the output of the network is a softmax over 2 possible results, f(A, B) = 1 and f(A, B) = 0
	embeddingLabels: ["A:B"], // the embedding vector represents the input setting A,B for some A in [0, 1] and B in [0, 1]
	outputLabels: ["on", "off"], // the two output signals represent a probability for the output of the gate to be on or off
	learningRate: 0.8
});

// initialize random embedding vectors for each of the possible settings of A and B
var em_0_0 = Utils.Vector.random(5);
var em_0_1 = Utils.Vector.random(5);
var em_1_0 = Utils.Vector.random(5);
var em_1_1 = Utils.Vector.random(5);

// train with our data for 100 iterations
for (var i = 0; i < 100; i++) {
	// for each training example with a known result, provide 
	//   the labeled input signals (none),
	//   the labeled embedding vector for that training example (over settings of A,B)
	//   the labeled output signals for that training example (f(A, B))
	// and update the embedding for that training example's setting of A,B with the embedding after update
	em_0_0 = nn.train({}, {"A:B": em_0_0}, {"on": 0.0, "off": 1.0}).resultEmbeddings["A:B"];
	em_0_1 = nn.train({}, {"A:B": em_0_1}, {"on": 1.0, "off": 0.0}).resultEmbeddings["A:B"];
	em_1_0 = nn.train({}, {"A:B": em_1_0}, {"on": 1.0, "off": 0.0}).resultEmbeddings["A:B"];
	em_1_1 = nn.train({}, {"A:B": em_1_1}, {"on": 0.0, "off": 1.0}).resultEmbeddings["A:B"];
}

console.log(nn.predict({}, {"A:B": em_0_0})); // ex. { outputs: { "on": 0.006, "off": 0.993 }
console.log(nn.predict({}, {"A:B": em_0_1})); // ex. { outputs: { "on": 0.996, "off": 0.003 }
console.log(nn.predict({}, {"A:B": em_1_0})); // ex. { outputs: { "on": 0.997, "off": 0.002 }
console.log(nn.predict({}, {"A:B": em_1_1})); // ex. { outputs: { "on": 0.005, "off": 0.994 }