Hi Markus!



 CesMak:


x: input vector: 180x1

60x1 binary vector for card is on the table
60x1 binary vector for card is already played
60x1 binary vector for card is on the players hand.
*y: output vector: 60x1 (has only one 1 for the card index of the action that is played by the MCTS player).



Questions:

As you can see I have binary input and binary output vector. Is this advisable to use binary inputs and binary outputs?



There is no problem in general with having binary inputs and/or
outputs.  Also, to first approximation, you don’t get to choose your
inputs and outputs – the problem you are trying to solve gives
them to you.
Note, however, that your target vector – the value of your y vector
that you are given (rather than predict) and use to train with – is
not a general binary vector.  It is a class label, equivalent to an
integer class label that takes it values in [0, 59] (inclusive). However,
it is one-hot encoded – that is, it is a binary vector with exactly
one 1 value (as you specified).



I have no doubt on how to design my nn (number of hidden layers, relu or linear etc.) What would you suggest?



I would start by treating this as a conventional classification problem.
You have an input of 180 (binary) “features.”  You are trying to predict
which of 60 classes that input corresponds to.
A good starting point would be a one- or two-hidden-layer network.
So, for a single-hidden-layer network,  you might have a 180x120
fully-connected layer followed by a rectified-linear activation function
(“ReLU”), followed by a 120x60 fully-connected layer that produces
a vector of 60 raw scores (logits) as your output.
For two hidden layers you could add a second ReLU followed by,
say, a 60x60 fully-connected layer.
You could also try other nonlinear activations in place of ReLU (such
as tanh).



Also the loss function I do not know how I should choose it.



Then feed your output vector and target into CrossEntropyLoss.
(For this, you will need to recast your one-hot target vector into a
single integer class label, because this is what CrossEntropyLoss
expects.)
Now for some more speculative comments:
I assume that in a given position in each of your three 60x1 binary
vectors at most one of the binary values can be 1.  That is, you
have 60 different cards, and there is only one copy of any given
card.  (And there are three other players whose hands are “hidden”
and therefore are not encoded in any vectors.)
This is structure that your network will have to “learn.”  Hypothetically
you could encode this structure in your inputs (so the network won’t
have to learn it), for example, by having your input be a single length-60
vector with entries that take on four values: on-table, played, in-hand,
and in-hidden-hands.  However, my intuition tells me that this would be
no better (and likely worse).
Also, I assume that there is a constraint that the class label (the one-hot
target vector in your original description) (and hence the prediction)
can only be one of the cards currently in the player’s hand – that is, a
card for which the player’s hand has a 1 in the corresponding position.
This is also structure that the network must learn.  I don’t see an
attractive way of telling the network this structure, but you could
make it easier for the network to learn this structure.  To do this,
you could add one more fully connected layer (to either your one- or
two-hidden-layer network) where you concatenate the player’s-hand
length-60 binary vector with the length-60 (former) output vector,
and pass it through a 120x60 fully-connected layer to form your
(new) length-60 output vector.
Giving your network a second “late look” at the player’s hand should
make it easy (I think) for the network to learn the constraint that you
can only play a card you have.
Of course, this is only a bunch of talk about what might work.  The
name of the game in this neural-network business is to try it out and
see what actually does work.
This sounds like an interesting (and potentially doable) problem.
Good luck!
K. Frank