clip_by_norm incorrectly receives negative clip_norm and outputs unexpected result
Hi @drewshark ,

Thanks for reporting this.I have replicated the issue in both Tf2.12 and tf-nightly versions and attached [gist](https://colab.research.google.com/gist/SuryanarayanaY/3b9b6fd41484b540171c2f87f7d60d90/61158.ipynb) for reference.

I quickly gone through the source code and It seems the API not validating the `clip_norm` argument. Needs to check more details for fixing it. If you have plan for submitting fix please feel to raise a PR. Thanks!

 @drewshark ,
The proposed PR has been merged and changes replicable in tf-nightly. Please verify and feel free to close the issue now.
Thanks! This issue is stale because it has been open for 7 days with no activity. It will be closed if no further activity occurs. Thank you. This issue was closed because it has been inactive for 7 days since being marked as stale. Please reopen if you'd like to work on this further. Are you satisfied with the resolution of your issue?
<a href="https://docs.google.com/forms/d/e/1FAIpQLSfaP12TRhd9xSxjXZjcZFNXPGk4kc1-qMdv3gc6bEP90vY1ew/viewform?entry.85265664=Yes&entry.2137816233=https://github.com/tensorflow/tensorflow/issues/61158">Yes</a>
<a href="https://docs.google.com/forms/d/e/1FAIpQLSfaP12TRhd9xSxjXZjcZFNXPGk4kc1-qMdv3gc6bEP90vY1ew/viewform?entry.85265664=No&entry.2137816233=https://github.com/tensorflow/tensorflow/issues/61158">No</a>

### Issue type

Bug

### Have you reproduced the bug with TensorFlow Nightly?

Yes

### Source

source

### TensorFlow version

2.12.0

### Custom code

Yes

### OS platform and distribution

_No response_

### Mobile device

_No response_

### Python version

_No response_

### Bazel version

_No response_

### GCC/compiler version

_No response_

### CUDA/cuDNN version

_No response_

### GPU model and memory

_No response_

### Current behavior?

Following the documentation, tf.clip_by_norm should not accept negative clip_norm (https://www.tensorflow.org/api_docs/python/tf/clip_by_norm). But it can.

```
import tensorflow as tf
import numpy as np

t = tf.constant(np.ones((3, 3)),)

res = tf.clip_by_norm(t, clip_norm=-10, axes=[1])
print(res)
```
```
tf.Tensor(
[[-5.77350269 -5.77350269 -5.77350269]
 [-5.77350269 -5.77350269 -5.77350269]
 [-5.77350269 -5.77350269 -5.77350269]], shape=(3, 3), dtype=float64)
```

If I change t to all zero tensor, it even outputs NaN:
```
import tensorflow as tf
import numpy as np

t = tf.constant(np.zeros((3, 3)),)

res = tf.clip_by_norm(t, clip_norm=-10, axes=[1])
print(res)
```
```
tf.Tensor(
[[nan nan nan]
 [nan nan nan]
 [nan nan nan]], shape=(3, 3), dtype=float64)
```

### Standalone code to reproduce the issue

```shell
import tensorflow as tf
import numpy as np

t = tf.constant(np.ones((3, 3)),)
res = tf.clip_by_norm(t, clip_norm=-10, axes=[1])
print(res)

t = tf.constant(np.zeros((3, 3)),)
res = tf.clip_by_norm(t, clip_norm=-10, axes=[1])
print(res)
```
```


### Relevant log output

_No response_