A method of performing privacy-preserving machine learning, the method comprising: storing, at K training computers, secret-shared private data from a plurality of data clients, K being equal to two or more, wherein each data item of the secret-shared private data is represented by K parts when secret-shared, and wherein the secret-shared private data includes a set of training samples, each having d features X and an output Y; initializing values for a set of d weights W for a machine learning model, the weights being secret-shared among the K training computers, wherein the weights and the features are decimal values that are shifted and stored as integers; selecting a training sample I having d features X I ; performing, using the K training computers, a first multiplication using X I and W to obtain a multiplication result u ; using a garbled circuit to evaluate, using the K training computers, a function F of the multiplication result u to obtain a forward propagation result Yi*, where the Function F is: a first constant when u is less than a first cutoff, a second constant when u is greater than a second cutoff, and a monotonically changing function between the first constant and the second constant when u is between the first cutoff and the second cutoff; determining, using the K training computers, an error term D using Yi* and an output Yi of the selected training sample; performing, using the K training computers, a second multiplication of the error term D and a Jth element X I,J of X I to obtain a Jth delta Δ J ; using the delta Δ J to update W J ; and repeating for other training samples and other weights of the d weights to train the machine learning model. storing, at K training computers, secret-shared private data from a plurality of data clients, K being equal to two or more, wherein each data item of the secret-shared private data is represented by K parts when secret-shared, and wherein the secret-shared private data includes a set of training samples, each having d features X and an output Y; initializing values for a set of d weights W for a machine learning model, the weights being secret-shared among the K training computers, wherein the weights and the features are decimal values that are shifted and stored as integers; selecting a training sample I having d features X I ; performing, using the K training computers, a first multiplication using X I and W to obtain a multiplication result u ; using a garbled circuit to evaluate, using the K training computers, a function F of the multiplication result u to obtain a forward propagation result Yi*, where the Function F is: a first constant when u is less than a first cutoff, a second constant when u is greater than a second cutoff, and a monotonically changing function between the first constant and the second constant when u is between the first cutoff and the second cutoff; a first constant when u is less than a first cutoff, a second constant when u is greater than a second cutoff, and a monotonically changing function between the first constant and the second constant when u is between the first cutoff and the second cutoff; determining, using the K training computers, an error term D using Yi* and an output Yi of the selected training sample; performing, using the K training computers, a second multiplication of the error term D and a Jth element X I,J of X I to obtain a Jth delta Δ J ; using the delta Δ J to update W J ; and repeating for other training samples and other weights of the d weights to train the machine learning model. <EOS>